我有以下代码和输出。我不明白为什么该函数接收不正确的参数。请提供指针。
var tempAccounts = [];
var i;
for (i = 0; i < accountIDs.length; i++) {
var accountID = accountIDs[i];
console.log("Log1:" + accountID);
tempAccounts.push(function(callback){createTempAccount(accountID, callback)})
}
async.parallel(tempAccounts, function (error, results) {
if (error) {
sendError(error, "error creating temp acounts", res, logTag);
} else {
res.set('Content-Type','application/json');
res.send(200, {});
}
});
function createTempAccount(accountID, callback)
{
console.log("Log2:" + accountID);
...
}
输出:
Log1: 1234
Log1: abcd
Log2: 1234
Log2: 1234
这里可能是什么问题?
答案 0 :(得分:1)
您不需要所有其他代码即可看到问题。可以将其简化为以下代码段。在循环中定义函数时,将在闭包中捕获一个共享变量。然后,当您调用这些函数时,只会得到一个值:
var tempAccounts = [];
let accountIDs = [200, 400]
var i
for ( i = 0; i < accountIDs.length; i++) {
var accountID = accountIDs[i];
console.log("Log1:" + accountID);
tempAccounts.push(function(){return accountID})
}
// all the same value
console.log(tempAccounts.map(i => i()))
最简单的方法是在循环的每次迭代中使用let
定义一个新变量:
var tempAccounts = [];
let accountIDs = [200, 400]
for (let i = 0; i < accountIDs.length; i++) {
let accountID = accountIDs[i];
console.log("Log1:" + accountID);
tempAccounts.push(function(){return accountID})
}
// now you get the unqie values:
console.log(tempAccounts.map(i => i()))