首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历异步请求

遍历异步请求
EN

Stack Overflow用户
提问于 2017-06-20 01:26:31
回答 3查看 1.5K关注 0票数 1

所以我有下面的代码来遍历一个对象:

代码语言:javascript
复制
for(var x in block){
    sendTextMessage(block[x].text, sender, function(callback){
        //increment for?
    })
}

对于每次迭代,我想要做一个请求(发送facebook消息),只有在该请求完成后,我才想经历下一个迭代操作,这是因为如果没有任何回调,消息将不会以正确的顺序发送。

代码语言:javascript
复制
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')
        }
    })
}

我以前遇到过这个问题,但是我不能解决它,我怎么能,以某种方式做到这一点?

如果你有任何问题,请提出来。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-20 21:20:38

我最终遵循了@Matt Diamond的建议,并执行了一个如下所示的递归函数:

代码语言:javascript
复制
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
        }
    }
}

感谢大家的帮助,非常感谢。

票数 0
EN

Stack Overflow用户

发布于 2017-06-20 01:38:38

你可以使用async模块,它会对你逐一提出请求很有帮助。下面是async官方文档中的示例代码,理解起来相当直观。

代码语言:javascript
复制
  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)
  })

}
票数 2
EN

Stack Overflow用户

发布于 2017-06-20 01:43:41

我以前解决这个问题的方法之一是使用间隔计时器,有点像这样:

代码语言:javascript
复制
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')
        }
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44636542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档