#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