由于错误

时间:2016-06-15 13:04:28

标签: javascript rxjs

我有以下小提琴(我有一些代码的简化版)。

https://jsfiddle.net/9uau0ya4/

const subject = new Rx.Subject();

const subscription = subject.flatMap(Rx.Observable.fromPromise).subscribe((value) => {
  console.log(value);
});

const promise1 = new Promise((resolve) => {
  resolve(1);
});

const promise2 = new Promise((resolve) => {
  resolve(2);
});

const promise3 = new Promise((resolve) => {
  resolve(3);
});
subject.onNext(promise1);
subject.onNext(promise2);
subject.onNext(promise3);

当我运行那个小提琴时,我希望将1,2,3记录到控制台。发生的情况是1记录正常,但是对主题的下两个onNext()调用显示错误     未捕获(承诺)TypeError:self._s.schedule不是函数

我已经尝试了上述原生承诺和q.js承诺,两者似乎都显示相同。我查看过这些文档,但我似乎无法回答这里发生的事情。

1 个答案:

答案 0 :(得分:3)

这可能是功能绑定的问题。如果您查看此jsfiddle,则可以正常使用。两者之间的区别在于,最后this显然与Rx.Observable绑定。

我似乎找不到能够正确解释这一问题的文章,但基本上如果你是一个具有属性的对象,obj.a.b(x)和b是一个函数,那么对this进行评估和b }绑定到obj.a。但是如果你在没有调用函数的情况下执行obj.a.b,那么评估将返回一个函数表达式,我不记得该函数的this是什么。

const subject = new Rx.Subject();
const fromPromise = function (x) {
return Rx.Observable.fromPromise(x);
}

  const subscription = subject.flatMap(fromPromise).subscribe((value) => {
    console.log(value);
  });

  const promise1 = new Promise((resolve) => {
    resolve(1);
  });

  const promise2 = new Promise((resolve) => {
    resolve(2);
  });

  const promise3 = new Promise((resolve) => {
    resolve(3);
  });
  subject.onNext(promise1);
  subject.onNext(promise2);
  subject.onNext(promise3);