我试图执行3&#http; 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,因此代码将始终每秒运行
答案 0 :(得分:5)
您可以使用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()
中,您可以看到如何轻松定义此订单的顺序。
答案 1 :(得分:1)
对标题的回答:你不能让它们同步。但你可以对它们进行排序。
您可能应该使用setInterval
替换setTimeout
,然后在第三个请求完成后再发出另一个setTimeout
。否则,setInterval
将导致在第三个请求有机会完成之前重新发出第一个请求。这可能是个问题。