Javascript异步循环变量

时间:2015-12-22 11:41:54

标签: javascript loops asynchronous

我打赌我有一个常见问题,但由于我仍然是异步javascript的新手,我不确定我的问题的(最佳)解决方案是什么。

我经历了一个for循环,在那个循环中我调用了一个包含回调方法的方法。在回调方法中,我想知道哪个循环是最新的循环。但是该方法需要一点点才能继续进行,并且当它完成一次时,围绕它的for循环结束并且计数器变量i已经处于最高位置。所以我的问题是,如何确定回调方法中的最新循环?

以下是它的示例代码。

var i;
for (i = 0; i < numMessages; i++){
    var lastMessage;
    if (i+1 === numMessages) {
        lastMessage = true;
    }
    else {
        lastMessage = false;
    }
    twilioClient.sendMessage({
        to: recipientNumber,
        from: zenyaTwilioNumber,
        body: (numMessages > 1? (i+1) + '/' + Math.ceil(options.messageBody.length/153) + ': ' + options.messageBody.substring(i*153, (i+1)*153): options.messageBody)
    }, 
    function (err, res) {
        if (err) {
            callback({error: err});
        }
        else {
            console.log('Message:' +i);
            console.log('numMessages: ' + numMessages); // Even after method is executed once, the lastMessage variable is already true
            if (lastMessage) {
                var returnObj = {
                    status : status,
                    recipient : res.to,
                    statusMessage : res.status
                };
                callback({result: returnObj}); // The callback should only be called once here.
            }
        }
    });
}

期待您的答案并学习如何实现这一目标的最佳实践。

谢谢, 本尼

1 个答案:

答案 0 :(得分:0)

您需要创建一个以下功能:

  • 获取您要在回调中访问的参数
  • 返回回调函数

然后用实际参数值调用该函数。

所以而不是:

function (err, res) {
    // ...
}

你需要:

(function(i, lastMessage) {
    return function(err, res) {
        // ... 
    }
})(i, lastMessage)

将它应用于您的示例:

var i;
for (i = 0; i < numMessages; i++){
    var lastMessage;
    if (i+1 === numMessages) {
        lastMessage = true;
    }
    else {
        lastMessage = false;
    }
    twilioClient.sendMessage({
        to: recipientNumber,
        from: zenyaTwilioNumber,
        body: (numMessages > 1? (i+1) + '/' + Math.ceil(options.messageBody.length/153) + ': ' + options.messageBody.substring(i*153, (i+1)*153): options.messageBody)
    }, 
    (function(i, lastMessage) {
        return function (err, res) {
            if (err) {
                callback({error: err});
            }
            else {
                console.log('Message:' + i);
                console.log('numMessages: ' + numMessages);
                if (lastMessage) {
                    var returnObj = {
                        status : status,
                        recipient : res.to,
                        statusMessage : res.status
                    };
                    callback({result: returnObj}); // The callback should only be called once here.
                }
            }
        };
    })(i, lastMessage)); 
}