循环通过asynchronous请求

所以我有以下代码循环通过一个对象:

for(var x in block){ sendTextMessage(block[x].text, sender, function(callback){ //increment for? }) } 

对于每个迭代,我想要做一个请求(发送一个facebook消息),只有在请求完成后,我想通过下一个迭代,这是因为没有任何callback,消息将不会被正确的连续发送。

 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') } }) } 

我以前遇到过这个问题,但是没能解决,我怎么能这样做?

如果您有任何疑问,请询问。 谢谢。

您可以使用asynchronous模块,这将非常有助于您逐一提出请求。 下面是来自asynchronous官方文档的示例代码,它非常直观易懂。

  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) }) } 

我过去解决这个问题的方法之一就是使用间隔计时器,例如:

 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') } }) } 

我结束了@Matt钻石的build议,做一个recursion函数,看起来像这样:

 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 } } } 

谢谢大家给了一些帮助,非常感谢。