Сохранить асинхронный / ожидающий ответ в переменной

1

Я пытаюсь понять асинхронные вызовы, используя 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
    globalData не должен быть undefined , это должен быть Promise (это единственное, что может вернуть асинхронная функция).
  • 0
    Обратите внимание, что async / await не являются "ecmascript-6" (правильно: ECMAScript 2015). Они были добавлены в ES2017, два года спустя.
Показать ещё 2 комментария
Теги:
ecmascript-6
es6-promise

4 ответа

2
Лучший ответ

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 на верхнем уровне просто отлично, как я делаю выше.

  • 1
    Или, если вы хотите использовать async / await до конца : pastebin.com/i6FPUs2y (но важно, чтобы весь код в этой оболочке был в try / catch - без него вы настраиваетесь на ошибки «Unhandled rejection») ,
  • 1
    Да - но неправильно. try / catch (или с помощью .catch на результат) не является обязательным.
Показать ещё 7 комментариев
0

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;
})();
  • 0
    это хороший трюк IIFE :)
  • 0
    @ guest271314 означает ли это, что все, что я хотел бы сделать с глобальными данными, должно быть выполнено в (async () => {}) (); объем?
Показать ещё 1 комментарий
-2

Просто используйте обратный вызов/обещание (каскадное программирование):

axios(users).then(function(response) {
    const globalData = response;
    console.log(globalData) 
});
  • 0
    Я писал свой ответ на мобильном телефоне, когда ответ был представлен выше, и я не видел его. Я не копировал это. Извините за недопонимание.
-3

Поскольку события происходят асинхронно, вам необходимо связать обратный вызов/обещание. Я собираюсь предположить, что он вернет обещание.

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)
}
  • 3
    «Я собираюсь предположить, что это возвращает обещание». Никаких предположений не требуется. Это async функция. По определению, это возвращает обещание. Но нет веской причины для ответа на вопрос с базовым искажением факта (что globalData остается undefined , чего не будет с кодом в вопросе) до тех пор, пока / или ОП не прояснит.
  • 1
    asyncExample ничего не возвращает. Что вы ожидаете, что строка console.log(success) будет регистрироваться? Это будет входить undefined . ОП должен return data из этой функции.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню