Видимость переменных в функции

Есть такая функция:

async function repos(user, type) {
    const axios = require('axios');
    if (type === "--full") {
        let message = "";
        axios({
            method: 'get',
            url: `https://api.github.com/users/${user}/repos`,
            responseType: 'json',
        })
            .then(function (response) {
                for (let i = 0; i < response.data.length; i++) {
                    message += ` N: ${response.data[i]['name']}, F:  ${response.data[i]['fork']}, L:  ${response.data[i]['language']} ❗ `;
                }
            })
            .catch(function (err) {
                console.error(err);
            })
    }
    else {
        axios({
            method: 'get',
            url: `https://api.github.com/users/${user}/repos`,
            responseType: 'json',
        })
            .then(function (response) {
                for (let i = 0; i < response.data.length; i++) {
                    message += ` N: ${response.data[i]['name']}❗ `;
                }

            })
            .catch(function (err) {
                console.error(err);
            })
    }
    return ` ${message} `;
}

Мне необходимо, чтобы переменная message прошла if, а затем заполнилась в цикле. Но во всех случаях, return '${message}' выводит undefined.

Пробовал переставлять определение переменной непосредственно в блок if, разделять на две переменные, делать return из каждого блока if. Либо переменная не определена, либо она undefined.

Подскажите, как мне надо объявить переменную, чтобы я мог её заполнить и вывести в return?


Ответы (1 шт):

Автор решения: nörbörnën

Так как ваша функция объявлена как асинхронная async function repos вы можете пользоваться всеми возможностями асинхронного подхода (вернее, специального синтаксиса для работы с Promise):

const axios = require('axios').default;
const os = require('os');

const type = '--full';
const repoOwner = 'sindresorhus';

// Вариант 1
(async () => {
    try {        
        const messages = await repos(repoOwner, type === '--full');
        console.log(messages);
    } catch (err) {
        console.error(err);
    }
})();

// Вариант 2
repos(repoOwner).then((messages) => {
    console.log(messages)
});

async function repos(user, showFullData) {
    const { data } = await axios({
        method: 'get',
        url: `https://api.github.com/users/${user}/repos`,
        responseType: 'json',
    });

    const messageHandler = showFullData === true ? githubReposFullName : githubReposName;
    const messages = (data || []).map(messageHandler);

    return messages.join(os.EOL);
}

function githubReposName(repoData) {
    return ` N: ${repoData.name}❗ `;
}

function githubReposFullName(repoData) {
    return ` N: ${repoData.name}, F:  ${repoData.fork}, L:  ${repoData.language} ❗ `;
}

Для освоения: Промисы, async/await на сайте learn.javascript.ru

→ Ссылка