Видимость переменных в функции
Есть такая функция:
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 шт):
Так как ваша функция объявлена как асинхронная 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