Javascript 异步循环变量

标签 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.
            }
        }
    });
}

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

谢谢, 奔尼

最佳答案

您需要创建一个函数:

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

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

所以代替:

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

关于Javascript 异步循环变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34415155/

相关文章:

javascript - 如何摆脱 chart.js 圆环图中较大的左右边距?

sql - 如何根据参数对 x 个表列求和?

javascript - 异步 POST 到数据库时出现问题

C++11 线程与异步性能(VS2013)

javascript - Node.js request.post 返回未定义

javascript - 如何使用 JavaScript 获取 GridView 列的总和

javascript - React 组件中未定义的某些对象属性

Java:带循环的数组

javascript - Handlebars js : how to get a variable in an each loop?

python - 与 Tornado WebSocket 服务器的并发连接