我有以下小提琴(我有一些代码的简化版)。
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承诺,两者似乎都显示相同。我查看过这些文档,但我似乎无法回答这里发生的事情。
答案 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);