Я пытаюсь понять асинхронные вызовы, используя async/wait и try/catch.
В приведенном ниже примере, как я могу сохранить свой успешный ответ на переменную, которая может быть использована во всем остальном коде?
const axios = require('axios');
const users = 'http://localhost:3000/users';
const asyncExample = async () =>{
try {
const data = await axios(users);
console.log(data); //200
}
catch (err) {
console.log(err);
}
};
//Save response on a variable
const globalData = asyncExample();
console.log(globalData) //Promise { <pending> }
1) Верните что-то из своей функции asyncExample
const asyncExample = async () => {
return await axios(users)
};
2) Назовите эту функцию и обработайте ее возвращенное Promise
:
asyncExample().then(users => {
console.log(users)
})
.catch(err => console.error(err))
Зачем вам это делать?
Вы не можете делать await
верхнего уровня (там есть предложение для него) - await
должно существовать в async
функции.
Маркировка функции async
приведет к возврату Promise
. Вы можете справиться с этим Promise
на верхнем уровне просто отлично, как я делаю выше.
async
/ await
до конца : pastebin.com/i6FPUs2y (но важно, чтобы весь код в этой оболочке был в try
/ catch
- без него вы настраиваетесь на ошибки «Unhandled rejection») ,
try
/ catch
(или с помощью .catch
на результат) не является обязательным.
try..catch
создает новую область блока. Используйте let
для определения data
перед try..catch
вместо const
, return
data
из asyncExample
функции asyncExample
(async() => {
const users = 123;
const asyncExample = async() => {
let data;
try {
data = await Promise.resolve(users);
} catch (err) {
console.log(err);
}
return data;
};
//Save response on a variable
const globalData = await asyncExample();
console.log(globalData);
// return globalData;
})();
Просто используйте обратный вызов/обещание (каскадное программирование):
axios(users).then(function(response) {
const globalData = response;
console.log(globalData)
});
Поскольку события происходят асинхронно, вам необходимо связать обратный вызов/обещание. Я собираюсь предположить, что он вернет обещание.
const axios = require('axios');
const users = 'http://localhost:3000/users';
const asyncExample = async () =>{
try {
const data = await axios(users);
console.log(data); //200
}
catch (err) {
console.log(err);
}
};
//Save response on a variable
const globalData = asyncExample().then( (success, err) => {
if (err) { console.error(err); }
console.log(success)
}
async
функция. По определению, это возвращает обещание. Но нет веской причины для ответа на вопрос с базовым искажением факта (что globalData
остается undefined
, чего не будет с кодом в вопросе) до тех пор, пока / или ОП не прояснит.
asyncExample
ничего не возвращает. Что вы ожидаете, что строка console.log(success)
будет регистрироваться? Это будет входить undefined
. ОП должен return
data
из этой функции.
globalData
не должен бытьundefined
, это должен бытьPromise
(это единственное, что может вернуть асинхронная функция).async
/await
не являются "ecmascript-6" (правильно: ECMAScript 2015). Они были добавлены в ES2017, два года спустя.