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