所以我有下面的代码来遍历一个对象:
for(var x in block){
sendTextMessage(block[x].text, sender, function(callback){
//increment for?
})
}对于每次迭代,我想要做一个请求(发送facebook消息),只有在该请求完成后,我才想经历下一个迭代操作,这是因为如果没有任何回调,消息将不会以正确的顺序发送。
function sendTextMessage(text, sender, callback) {
let messageData = { text:text}
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {access_token:token},
method: 'POST',
json: {
recipient: {id:sender},
message: messageData,
}
}, function(error, response, body) {
if (response.statusCode >= 200 && response.statusCode < 300){
if(callback) callback('success')
}
})
}我以前遇到过这个问题,但是我不能解决它,我怎么能,以某种方式做到这一点?
如果你有任何问题,请提出来。谢谢。
发布于 2017-06-20 21:20:38
我最终遵循了@Matt Diamond的建议,并执行了一个如下所示的递归函数:
function buildFlow(block, sender){
var i = 0;
recursive()
/* for(var x in block){
sendTextMessage(block[x], block[x].type, sender)
console.log(x)
}*/
function recursive(){
if (i<Object.keys(block).length){
sendTextMessage(block[Object.keys(block)[i]], block[Object.keys(block)[i]].type, sender, function(){
i++
recursive()
})
}else{
i = 0
}
}
}感谢大家的帮助,非常感谢。
发布于 2017-06-20 01:38:38
你可以使用async模块,它会对你逐一提出请求很有帮助。下面是async官方文档中的示例代码,理解起来相当直观。
function asyncForEach (arr, iterator, callback) {
queue = arr.slice(0)
// create a recursive iterator
function next (err) {
if (err) return callback(err)
// if the queue is empty, call the callback with no error
if (queue.length === 0) return callback(null)
// call the callback with our task
// we pass `next` here so the task can let us know when to move on to the next task
iterator(queue.shift(), next)
}
// start the loop;
next()
}
function sampleAsync (param, done) {
// put a callback when function is done its work
}
asyncForEach(result, function (param, done) { // result is the array you pass as iterator
sampleAsync(param, function (message) {
console.log(message)
done()
})
}, function () {
console.log('callback')
callback(SOME_RESULT)
})
}发布于 2017-06-20 01:43:41
我以前解决这个问题的方法之一是使用间隔计时器,有点像这样:
var isSending = false;
var sendMessages = setInterval(function() {
if(!isSending) {
isSending = true;
sendTextMessage(block.pop().text, sender, function(){
if(block.length) {
isSending = false;
} else {
clearInterval(sendMessages);
//Done
}
})
}
})
function sendTextMessage(text, sender, callback) {
let messageData = { text:text}
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {access_token:token},
method: 'POST',
json: {
recipient: {id:sender},
message: messageData,
}
}, function(error, response, body) {
if (response.statusCode >= 200 && response.statusCode < 300){
if(callback) callback('success')
}
})
}https://stackoverflow.com/questions/44636542
复制相似问题