Как я могу сделать запрос axios get синхронным?

#javascript #async-await #axios

#javascript #асинхронный-ожидание #axios

Вопрос:

Я относительно новичок в js и пытаюсь разобраться с async-await. Мне не хватает чего-то фундаментального. Я хочу сделать HTTP GET, который блокируется до тех пор, пока ответ не будет готов. Я создал приведенный ниже код, ожидая, что он будет напечатан:

main1 false «Некоторые данные» main2

вместо этого он печатает:

main1 true неопределенный main2

Как я могу разрешить это встроенное обещание?

 const axios = require('axios');
'use strict'
let URLs= ["http://blah"];
main(process.argv)
function main(argv) {
    console.log('main1');
    const resp = httpgetimpl(URLs[0]);
    console.log(resp instanceof Promise);
    console.log(resp.data);
    console.log('main2');
}
async function httpgetimpl(url) {
    const resp = await axios.get(url);
    return resp;
}
  

Комментарии:

1. await не делает ничего синхронным. Это упрощает написание асинхронного кода. Тем не менее, просто сделайте main async function также и await обещание, которое вы получили.

2. Если вы console.log(resp.data); используете метод httpgetimpl() , вы вообще что-нибудь получаете?

3. 'use strict' должен быть первый оператор (в файле или функции), который вступит в силу

4. @Ricardo Sanchez console.log(соотв.данные); => выводит ответ, но после main2

5. Попробуйте return await axios.get(url);

Ответ №1:

Невозможно сделать асинхронную операцию (например, HTTP-запрос) синхронной в JS (в node наверняка есть синхронные API, но это не JS — это среда выполнения C)

Название await ключевого слова немного вводит в заблуждение, но это не означает «остановить выполнение всей программы здесь и ничего не делать, пока операция не завершится». Это означает «вернуть поток выполнения моему вызывающему (вернув обещание), и когда ожидаемая операция будет завершена, перезвоните мне и начните выполнение следующей строки»

Это просто синтаксический сахар для обещаний…

Ваша программа переписана с использованием Promises:

 function httpgetimpl(url) {
    return axios.get(url).then((resp) =>
      // do something with response if you want
      return resp;
    )    
}

function main(argv) {
    console.log('main1');
    const response = httpgetimpl(URLs[0]).then((resp) =>
    {
      // noop
    })
    // following statements are executed before the axios GET request finishes..
    console.log(response instanceof Promise); // true
    console.log(response.data);  // undefined
    console.log('main2');
}
  

… надеюсь, вы понимаете, почему он выводит то, что вы видите

Если вы сделаете свой main async и измените вызов на const resp = await httpgetimpl(URLs[0]); это, это код, использующий обещания:

 function httpgetimpl(url) {
    return axios.get(url).then((resp) =>
      // do something with response if you want
      return resp;
    )    
}

function main(argv) {
    console.log('main1');
    return httpgetimpl(URLs[0]).then((resp) =>
    {
      console.log(resp instanceof Promise);
      console.log(resp.data);
      console.log('main2');
    })
}
  

… который должен выводить ожидаемое