Ari*_*Ari 2 javascript observable typescript
我想使用一个返回一个observable的对象的方法来转换和替换数组中的所有单词.问题是由于结果是异步的,因此在错误的索引处错误地覆盖了结果的值.如果我有一个同步函数,我可以简单地在for循环中调用该函数.在这种情况下我该怎么办?
for(let word in this.words){
var i = Object.keys(this.words).indexOf(word);
this.convertor.get(this.words[i].value).subscribe( (result) => {
this.words[i].value = result; //The value of i is incorrect
});
}
Run Code Online (Sandbox Code Playgroud)
你可以使用一个普通的函数来解决这个问题,你将一个额外的参数绑定到
this.convertor.get(this.words[i].value).subscribe( function (i, result) {
this.words[i].value = result;
}.bind(this, i));
Run Code Online (Sandbox Code Playgroud)
.bind()返回一个(新)函数,它将类似于您应用的函数bind,但会预先确定实际调用该函数时的一些内容:
this然后将设置为您bind在第一个参数中传递的内容.与箭头函数相反,老式函数通常this通过函数的调用方式获得它们的价值 - 这种行为不是你想要的,所以它是一个受欢迎的特性bind;
一些论点可以预先修复.无论你传递的其他参数是否bind成为该函数的第一个参数的值 - 它们不是由实际调用决定的.在这种情况下,i的值被传递,因此函数将获得该值作为其第一个参数,无论以后如何调用它.
在调用时(返回)传递给函数的任何其他参数都将遵循前面提到的参数.在这种情况下,实际调用将传递result的值,因此该函数应该处理两个参数:一个bind由调用者提供,另一个由调用者提供.
这解决了您的问题,因为您可以将i的正确值传递给每个函数而不会丢失值this.
| 归档时间: |
|
| 查看次数: |
3570 次 |
| 最近记录: |