如何在异步回调中捕获局部变量值
How to capture local variable value on asynchronous callback
我有这个 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
?
尝试在 .then()
函数中使用 Function.prototype.bind()
,设置为 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));
}
你可以把它包装成函数
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]);
}
我有这个 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
?
尝试在 .then()
函数中使用 Function.prototype.bind()
,设置为 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));
}
你可以把它包装成函数
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]);
}