Смена скрипта с запроса на топор ios - лог ожидания ожидания - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужна помощь, потому что я новичок в node.js и работаю с пакетами узлов.

У меня есть следующий скрипт, который выполняет HTTP-запрос GET на узле, используя request что устарело сейчас

const foo = (bar, callback) => {
  const url = 'https://some.api.com?key=abc123';

  request({url: url, json: true}, (error, response) => {
    if (error) {
      callback('Oops, there is an error!', undefined);
    } else if(response.body.foobarArray.length === 0) {
      callback('No data found', undefined);
    } else {
      callback(undefined, {
        foobar1: response.body.foobar1,
        foobar2: response.body.foobar2,
      })
    }
  });
}

console.log(foo('Hello')); // this logs {foobar1: 'Hello', foobar2: 'World'}

Я пытаюсь переписать его, используя вместо этого axios, так что это мой код

const foo = async (bar) => {
    const url = 'https://some.api.com?key=abc123';

    try {
        const response = await axios.get(url);
        if (response.body.foobarArray.length === 0) {
            return 'No data found';
        } else {
          return {
            foobar1: response.body.foobar1,
            foobar2: response.body.foobar2,
          };
        }
    } catch (error) {
        return 'Ooops! Something went wrong :(';
    }
};

console.log(foo('Hello')); // This logs `Promise { <pending> }`

I ' я не уверен, что я делаю не так, потому что я не очень хорошо знаю, как именно работают обещания, но как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020
const foo = async (bar) => {
    const url = 'https://some.api.com?key=abc123';
    try {
        return await axios.get(url).then(response => {
            return new Promise((resolve, reject) => {
                if (response.body.foobarArray.length === 0) {
                    return reject('No data found');
                } else {
                    return resolve({
                        foobar1: response.body.foobar1,
                        foobar2: response.body.foobar2,
                    });
                }
            })
        }).catch(err => {
            return Promise.reject(err);
        });
    } catch (error) {
        // return 'Ooops! Something went wrong :(';
        return Promise.reject(`an error occurred : ${error}`);
    }
};
foo('hello').then(result => {
    console.log(result);
}).catch(err => {
    console.log(`error ! : ${err}`);
});

asyn c функции возвращает обещание. Функции asyn c используют неявный Promise для возврата своего результата. Даже если вы не возвращаете обещание явно, асинхронная c функция гарантирует, что ваш код передается через обещание
, поскольку вы используете асинхронный топор ios, это response - это promise, который должен быть обрабатываются внутри .then().catch() функций.
если не возникает ошибка, вы можете получить доступ к response внутри вашего .then(), иначе у вас будет доступ к вашему error на .catch()
внутри вашего .then() вас Теперь вы можете делать с данными что хотите, возвращая новое Обещание, используя resolve() для успеха и reject() для сбоя.

1 голос
/ 02 апреля 2020

У вас есть 2 варианта:

Опция 1 Любая асинхронная c функция возвращает Обещание (за кадром) так:

foo('Hello').then(console.log).error(console.error);

Вариант 2 Вам нужно дождаться результата функции foo, но в данный момент вы не можете использовать await вне уровня области действия функции. Итак:

async function main() {
  try {
    const result = await foo('Hello');
    console.log(result);
  } catch (err) {
    console.error(err);
  }
}

main();

В будущих выпусках Node.js использование await в глобальном масштабе будет разрешено.

...