2017-01-04 3 views
1

Я получил простой яваскрипт цикла и функцию обратного вызова с там и я struggeling с добавлениемКак обрабатывать яваскрипт сферы

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

Я полагаю, что он записывает «456» дважды в течение обратного вызова потому что это асинхронный вызов или что-то еще. Но я не уверен, как я могу это решить.

Любая идея?

[EDIT]

Я добавил еще один console.log к нему, который регистрирует значение, возвращаемое обратным вызовом. К моему удивлению, лог те же значение дважды, что соответствует 123, а не до 456. ПОЧЕМУ ОН ПОЧЕМУ ?! Как это может быть в божественном названии ?!

ответ

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

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

0

В обратном вызове при входе в currentAccount переменного, которая поступает из внешней области и в настоящее время назначенный в течение цикла.

Скорее всего, когда ваш асинхронный вызов вернется с первого вызова (сделанного, когда currentAccount был «123»), currentAccount уже принял значение второго элемента массива «456» внутри цикла for.

Можете ли вы попытаться зарегистрировать аргумент value, переданный вместо обратного вызова? Вы должны увидеть 2 разных значения, возвращаемых, один для учетной записи «123», а другой для учетной записи «456».

+0

Я понимаю, что на самом деле я не дал вам конкретной проблемы регистрации текущего счета из обратного вызова. Ассистент использует использование закрытий, как предлагали @yarons и другие. –

Смежные вопросы