我有一个简单的javascript循环和一个带回调的函数,我在添加
console.log(accounts); // logs this: ["123", "456"]
for (var i = 0; i < accounts.length; i++) {
var currentAccount = accounts[i];
console.log(currentAccount); // first logs "123" and then "456" as expected
meta.getBalance.call(account, {from: currentAccount}).then(function(value) {
console.log(currentAccount); // logs "456" twice
console.log(value.value()); // logs the same value corresponding to "123" twice
});
}
我认为它记录了&#34; 456&#34;在回调中两次,因为它是异步调用或其他东西。但我不确定如何解决这个问题。
有什么想法吗?
[编辑]
我又添加了一个console.log
,它记录了回调返回的值。令我惊讶的是,两次记录相同的值,相当于123,而不是456.为什么为什么?!神仙的名字怎么样?!
答案 0 :(得分:3)
您可以使用closure。
function cbGenerator(account) {
return function(value) {
console.log(account);
}
}
...后来
for (var i = 0; i < accounts.length; i++) {
var currentAccount = accounts[i];
console.log(currentAccount);
var cb = cbGenerator(currentAccount);
meta.getBalance.call(account, {from: currentAccount}).then(cb);
}
答案 1 :(得分:0)
在IIFE中调用您的功能
console.log(accounts); // logs this: ["123", "456"]
for (var i = 0; i < accounts.length; i++) {
var currentAccount = accounts[i];
console.log(currentAccount); // first logs "123" and then "456" as expected
(function(currentAccount){
meta.getBalance.call(account, {from:currentAccount}).then(function(value) {
console.log(currentAccount);
});
})(currentAccount);
}
答案 2 :(得分:0)
您可以将当前值传递给函数,该函数返回一个被调用的函数并可以访问您的值。多数民众赞成Closures。
var accounts = ["123", "456"];
for (var i = 0; i < accounts.length; i++) {
var currentAccount = accounts[i];
console.log(currentAccount); // first logs "123" and then "456" as expected
promise('account', {from: currentAccount}).then(currentAccount => res => {
console.log(currentAccount) // 123, then 456
});
}
function promise() {
return new Promise((res, rej) => res());
}
&#13;
答案 3 :(得分:0)
在回调中,您记录currentAccount
变量,该变量来自外部作用域并在for循环中分配。
最有可能的是,当您的异步调用从第一次调用返回时(当currentAccount为&#34; 123&#34;时),currentAccount已经获取了第二个数组元素的值&#34; 456&#34;在for循环中。
您是否可以尝试记录传递给回调的value
参数?您应该看到返回2个不同的值,一个用于帐户&#34; 123&#34;和另一个帐户&#34; 456&#34;。