我试图检测我的所有可观察物何时返回它们的值。导入import { Observable } from 'rxjs/Rx';
后,我就是这样做的:
let observables:any[] = [];
observables.push(this.getValue1().subscribe((value1)=> {
// Do something with value1
}));
observables.push(this.getValue2().subscribe((value2)=> {
// Do something with value1
}));
Observable.forkJoin(observables).subscribe(
data => {
console.log('initialized');
},
err => console.error(err)
);
我的值是通过observer.next(valueX);
我收到以下错误消息:TypeError: source.subscribe is not a function
。我做错了什么?
编辑:以下是我创建getValues()
getValue1(): any {
return new Observable(observer => {
this.asyncFunc(arg1, (err, value1)=> {
observer.next(value1);
}
}
}
答案 0 :(得分:1)
您没有将Observables
传递给forkJoin
您正在通过Subscriptions
。只要在subscribe
上调用Observable
,您就告诉它您已完成构建管道并准备开始处理,因此它将返回另一个Observable
而返回一个取消原语(读取) :订阅)。
最后只需要subscribe
块一次。如果你需要对forkJoin
注释中的值进行中间处理,那么它也需要一个可选的选择器参数。
let observables:any[] = [];
observables.push(this.getValue1());
observables.push(this.getValue2());
Observable.forkJoin(observables, ([value1, value2]) => {
//Do something with value1 and value2
return [value1, value2];
}).subscribe(
data => {
console.log('initialized');
},
err => console.error(err)
);
修改强>
现在,forkJoin
只有Observables
完成才会加入getValue1
。您需要完成源(并且可能还会处理任何错误)。因此getValue1(): any {
return new Observable(observer => {
this.asyncFunc(arg1, (err, value1)=> {
if (err)
return observer.error(err);
observer.next(value1);
observer.complete();
}
}
}
应该成为:
this.getValue1 = Observable.bindNodeCallback(this.asyncFunc);
this.getValue2 = Observable.bindNodeCallback(this.asyncFunc);
但请注意,已有一个名为bindNodeCallback
这将允许您简单地写:
let observables:any[] = [this.getValue1(), this.getValue2()];
让您以相同的方式调用这些函数:
bindNodeCallback
关于如何在完成时更新的第二个问题。如果您使用//Lift the length into the stream
Observable.of(observables.length)
//Create an Observable that emits any time one of the source
//streams emits
.flatMap(len => Observable.merge(observables),
//Compute the percentage completed
(len, _, inner, outer) => outer / len * 100)
//Do your updating
.subscribe(percentCompleted => /*Update progress bar*/);
,则可以使用辅助流来更新进度条。
bindNodeCallback
如果您选择不使用subscribe
,您可以做同样的事情,但是您需要做更多的腿部工作,因为您的每个流都很冷,这意味着每个asyncFunc
会产生一个对bindNodeCallback
的新呼叫(//Turns these in to ConnectableObservables
let observables:any[] = [this.getValue1().publishLast(), this.getValue2().publishLast()];
//Set up the other streams
Observable.of(...);
Observable.forkJoin(...);
//Start your Observables
observables.forEach(c => c.connect());
在呼叫时变热,并为新订户缓存返回的值)
$(function ()
{
$(".ccsdvCotentPS").trigger("onkeydown");
});