将更多值传递给可观察量的订阅函数

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)

tri*_*cot 6

你可以使用一个普通的函数来解决这个问题,你将一个额外的参数绑定到

    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,但会预先确定实际调用该函数时的一些内容:

  1. this然后将设置为您bind在第一个参数中传递的内容.与箭头函数相反,老式函数通常this通过函数的调用方式获得它们的价值 - 这种行为不是你想要的,所以它是一个受欢迎的特性bind;

  2. 一些论点可以预先修复.无论你传递的其他参数是否bind成为该函数的第一个参数的值 - 它们不是由实际调用决定的.在这种情况下,i的值被传递,因此函数将获得该值作为其第一个参数,无论以后如何调用它.

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

这解决了您的问题,因为您可以将i的正确值传递给每个函数而不会丢失值this.