Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 传递更多值以订阅可观测值的函数_Javascript_Typescript_Observable - Fatal编程技术网

Javascript 传递更多值以订阅可观测值的函数

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循环中调用该函数。在这种情况下我该怎么办

 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的值,因此函数将获得该值作为其第一个参数,无论以后如何调用它

  • 在调用(返回)时传递给函数的任何其他参数都将遵循前面提到的参数。在这种情况下,实际调用将传递result的值,因此函数应该处理两个参数:一个由
    bind
    提供,另一个由调用方提供


  • 这解决了您的问题,因为您可以将i的正确值传递给每个函数,而不会丢失
    的值另一个替代方法可以是
    forEach
    ,这样您就不必跟踪索引,也不必使用
    first()
    来清理订阅

    this.words.forEach((word, i) => {
      this.obs$(word)
        .pipe(
          tap(v => (this.words[i].value = v)),
          first()
        )
        .subscribe();
    });
    

    您能解释一下bind在这里到底做了什么吗?添加了解释。请投票选择比文档更清晰的解释:)