[英]How to make 'http requests' synchronous in Node js
我正在嘗試執行3個“ http請求”。 問題是,由於異步模式的性質,它無法按順序執行。 所有請求均針對內部api。 這是示例代碼:-
setInterval(function () {
// First request
request({}, function (error, response, body) {
// Second request
request({}, function (error, response, body) {
// Third request
request({}, function (error, response, body) {
})
})
})
},1000);
我想要達到的目的是基於一個條件( First request
)獲取數據,更新數據( Second request
)並發送短信和電子郵件( Third request
)。 由於異步的性質,代碼被重復很多次。 我正在使用setInterval,因此代碼將始終每秒運行一次
您可以使用Promises
輕松排序請求
// Load Dependencies:
var Promise = require('promise');
var request = require('request');
// Begin Execution:
main();
function main() {
getData() //Executes 1st
.then(updateData) //Whatever is 'fulfilled' in the previous method, gets passed to this function updateData
.then(sendNotification) //Whatever is fulfilled in the previoud method, gets passed to this function sendNotification.
.catch(function(err) {
console.log('If reject is called, this will catch it - ' +err);
});
}
// Request #1:
function getData() {
return new Promise(function(fulfill, reject) {
request({}, function(err, res, body) {
if (err) {
reject('Error making request - ' +err);
} else if (res.statusCode !== 200) {
reject('Invalid API response - ' +body);
} else {
fulfill(body);
}
});
});
}
// Request #2:
function updateData(data) {
return new Promise(function(fulfill, reject) {
request({}, function(err, res, body) {
if (err) {
reject('Error making request - ' +err);
} else if (res.statusCode !== 200) {
reject('Invalid API response - ' +body);
} else {
fulfill(body);
}
});
});
}
// Request #3
function sendNotification(phoneNumber, email) {
return new Promise(function(fulfill, reject) {
request({}, function(err, res, body) {
if (err) {
reject('Error making request - ' +err);
} else if (res.statusCode !== 200) {
reject('Invalid API response - ' +body);
} else {
fulfill(body);
}
});
});
}
因此,基本上,只需將您的異步函數包裝在return new Promise
,以通過fulfill
或reject
來返回就緒數據。 在function main()
,您可以看到如何輕松定義此訂單的順序。
標題答案:您不能使它們同步。 但是您可以對它們進行排序。
您可能應該將setInterval
替換為setTimeout
,然后在第三個請求完成后再發出另一個setTimeout
。 否則, setInterval
將導致在第三個請求有機會完成之前重新發出第一個請求。 這可能是問題所在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.