0

У меня есть этот for цикл:Как захватить локальную переменные асинхронный обратный вызов

for(var i = 0; i < characters.length; i++) 
{ 
    var character = characters[i]; 
    charService.get(character.name).then(function (characterData) 
    { 
     //I want character to be captured here, i.e. the character in the current loop 
     character.data = characterData; 
    }); 
} 

Как charService.get() асинхронные, к тому времени, обратный вызов выполняется, character является последним элементом массива (потому что петли), поэтому все предыдущие character остались без данных.

Как я могу гарантировать, что character.data внутри обратного вызова ссылается на character цикла, выполнялся асинхронный метод?

+0

использование ненадежный и передача параметров сделает сохраняться его –

+0

Это был дан ответ [здесь ] (http://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript-for-loop), [здесь] (http://stackoverflow.com/questions/4288759/asynchronous-for-cycle -in-javascript) и [здесь] (http://stackoverflow.com/quest Ионы/21184340/асинхронный для цикла-в-узел-JS). – roperzh

ответ

0

Попробуйте использовать Function.prototype.bind() в .then() функции, установите character

for(var i = 0; i < characters.length; i++) 
{ 
    var character = characters[i]; 
    charService.get(character.name).then(function (characterData) 
    { 
     //I want character to be captured here, i.e. the character in the current loop 
     this.data = characterData; 
    }.bind(character)); 
} 
+0

Красивая! Благодаря! –

1

Вы можете обернуть его в функцию

for(var i = 0; i < characters.length; i++) 
{ 
    (function(character){ 
    charService.get(character.name).then(function (characterData) 
    { 
     //I want character to be captured here, i.e. the character in the current loop 
     character.data = characterData; 
    }); 
    })(characters[i]); 
} 
+0

Это приятное решение! Очень креативно! –

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