как заставить async / await правильно работать в node js?

#node.js

#node.js

Вопрос:

я новичок в кодировании node js, у меня есть две функции в моем коде, одну из них я сделал асинхронной, используя ключевое слово async, но проблема в том, что это не работает, вывод из второй функции приходит перед первой функцией, но я хочу, чтобы вывод первой функции предшествовал второй функции, ниже приведен мой код

 var request = require("request").defaults({jar: true});

var cookieJar = request.jar();

var options = { method: 'POST',
url: 'http://69.30.210.130:8082/api/session',
headers:
    { 'content-type': 'application/x-www-form-urlencoded' },
form: { email: 'admin', password: 'admin' } };

request(options, async function (error, response, body) {
if (error) throw new Error(error);

let bod=await body;
console.log(bod)
});

var options = { method: 'GET',
url: 'http://69.30.210.130:8082/api/devices',
qs: { id: '1' },
headers:
{ 'postman-token': '021a3566-e1ea-4dd4-4ceb-c81ecd25ddd1',
 'cache-control': 'no-cache' } };

request(options, function (error, response, body) {
if (error) throw new Error(error);

console.log(body);
});
  

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

1.Вы могли бы рассмотреть возможность использования последовательного отступа при написании кода — это значительно упростит чтение и отладку не только для потенциальных ответчиков, но и для вас, когда мы все сможем сразу увидеть { } блоки и уровень их вложенности, вместо того, чтобы тщательно просматривать каждую строку только для того, чтобы найти логические пути.

2. хорошо, сэр, я обязательно позабочусь об этом с этого момента

Ответ №1:

request по умолчанию использует обратные вызовы, это означает, что когда вы хотите связать несколько запросов, вам нужно выполнить таким образом:

 // first request
request({...}, function(error, response, body1) {
    if (error) return console.error('Error', error.message);

    // second request
    request({...}, function(error, response, body2) {
        if (error) return console.error('Error', error.message); 

        console.log(body1, body2);
    });
});
  

async/await предназначен для упрощения работы с promises, поэтому вы можете использовать request-promise :

 const rp = require('request-promise');

(async function() { // await can be called only from within an async func
    try {
        const body1 = await rp({...}); // first request
        const body2 = await rp({...}); // second request

        console.log(body1, body2);

    } catch (e) {
        console.error('Error', e.message);
    }
})();
  

Здесь проблема body2 будет решена после того, body1 как она будет решена. Это означает async/await , что асинхронная обработка обеспечивает синхронное поведение.

Вы можете использовать axios то, что является Promises-base из коробки.


РЕДАКТИРОВАТЬ: async из обратных вызовов удалены, axios добавлена ссылка

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

1. В первом примере обратные вызовы не обязательно должны быть async