我打赌我有一个常见问题,但由于我仍然是异步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.
}
}
});
}
期待您的答案并学习如何实现这一目标的最佳实践。
谢谢, 本尼
答案 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));
}