Javascript 传递更多值以订阅可观测值的函数
我想使用返回可观察值的对象方法转换和替换数组中的所有单词。问题在于,由于结果是异步的,因此结果的值在错误的索引处被错误地覆盖。如果我有一个同步函数,我可以简单地在for循环中调用该函数。在这种情况下我该怎么办Javascript 传递更多值以订阅可观测值的函数,javascript,typescript,observable,Javascript,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(
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
});
}
由于ES6,您可以通过将
var i=
替换为let i=
来轻松解决这个问题。这样,您就得到了一个具有块作用域的变量,因此在循环的每次迭代中都会得到一个不同的变量实例
如果您不支持let
,原始答案也适用:
您可以使用一个普通函数来解决这个问题,该函数绑定了一个额外的参数:
this.convertor.get(this.words[i].value).subscribe( function (i, result) {
this.words[i].value = result;
}.bind(this, i));
返回一个(新)函数,该函数类似于您在其上应用的函数bind
,但将预先确定实际调用该函数的时间:
此
将被设置为在第一个参数中传递给bind
的内容。与箭头函数相反,老式函数通常通过调用函数的方式获得其值,这种行为不是您想要的,因此它是bind
的一个受欢迎的特性
bind
传递的任何其他参数都将成为该函数的第一个参数的值——它们不是由实际调用确定的。在本例中,传递i的值,因此函数将获得该值作为其第一个参数,无论以后如何调用它
bind
提供,另一个由调用方提供
这解决了您的问题,因为您可以将i的正确值传递给每个函数,而不会丢失
此的值另一个替代方法可以是forEach
,这样您就不必跟踪索引,也不必使用first()
来清理订阅
this.words.forEach((word, i) => {
this.obs$(word)
.pipe(
tap(v => (this.words[i].value = v)),
first()
)
.subscribe();
});
您能解释一下bind在这里到底做了什么吗?添加了解释。请投票选择比文档更清晰的解释:)