订阅forkJoin会返回错误消息

时间:2016-05-26 17:07:31

标签: typescript rxjs

我试图检测我的所有可观察物何时返回它们的值。导入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);
        }
    }
}

1 个答案:

答案 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");
});