【问题标题】:Javascript async loop variablesJavascript异步循环变量
【发布时间】:2015-12-22 11:41:53
【问题描述】:

我敢打赌我有一个常见的问题,但由于我对异步 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.
            }
        }
    });
}

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

谢谢, 本尼

【问题讨论】:

标签: javascript loops asynchronous


【解决方案1】:

您需要创建一个函数:

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

然后你用实际的参数值调用那个函数。

所以而不是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多