簡體   English   中英

可觀察的訂閱未調用

[英]Observable subscription not getting called

我有一個Observable,用於將諾言轉換為訂閱。 這導致我需要迭代一個集合以在每個元素上調用HTTP服務。 我正在使用forkJoin等待所有這些調用完成,以便我可以做其他事情,但是不幸的是,我的訂閱沒有被調用。 你看到我在這里想念的嗎?

Observable.fromPromise(this.users.getElements()).subscribe(results => {
  Observable.forkJoin(
    results.map(
      aUser => this.HttpService.submitUser(aUser).subscribe(
        results => {
          this.progress += 1;
        },
        err => {
          this.progress += 1;
          this.handleError(<any>err);
        })
    ).subscribe(
      //it never gets to either of these calls after all service calls complete
      data => {
        debugger;
        console.log(data);
        this.reset();
      },
      err => {
        debugger;
        console.log(err);
        this.reset();
      }
    ));
});

一件事是您不訂閱傳遞給forkJoin()每個Observable。 操作員必須自己做。

如果要在每個Observable完成時收到通知,則可以使用.do(undefined, undefined, () => {...})

let observables = [
  Observable.of(42).do(undefined, undefined, () => console.log('done')),
  Observable.of('a').delay(100).do(undefined, undefined, () => console.log('done')),
  Observable.of(true).do(undefined, undefined, () => console.log('done')),
];

Observable.forkJoin(observables)
  .subscribe(results => console.log(results));

打印到控制台:

done
done
done
[ 42, 'a', true ]

最終還有.finally()運算符。 但是,它與使用.do()

編輯:

當任何源Observable失敗時, forkJoin()運算符將重新forkJoin()錯誤(這意味着它也將失敗)。
這意味着您需要分別捕獲每個Observable源中的錯誤catch()例如,使用catch()運算符)。

let observables = [
  Observable.throw(new Error())
    .catch(() => Observable.of('caught error 1'))
    .do(undefined, undefined, () => console.log('done 1')),

  Observable.of('a')
    .delay(100).catch(() => Observable.of('caught error 2'))
    .do(undefined, undefined, () => console.log('done 2')),

  Observable.of(true)
    .catch(() => Observable.of('caught error 3'))
    .do(undefined, undefined, () => console.log('done 3')),
];

Observable.forkJoin(observables)
  .subscribe(results => console.log(results));

哪些打印:

done 1
done 3
done 2
[ 'caught error 1', 'a', true ]

我認為您不需要訂閱地圖。

Observable.fromPromise(this.users.getElements()).subscribe(results => {
  Observable.forkJoin(
    results.map(
      aUser => this.HttpService.submitUser(aUser))
    ).subscribe(
      //it never gets to either of these calls after all service calls complete
      data => {
        debugger;
        console.log(data);
        this.reset();
      },
      err => {
        debugger;
        console.log(err);
        this.reset();
      }
    ));
});

請注意,在此處的rxjs示例中:

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

他們不訂閱各個可觀察對象-ForkJoin使它們全部進行,然后等待它們全部返回(在您的訂閱中)。

編輯:

forkjoin源在這里:

https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoin.js

而且看起來好像沒有鈎子可以確定何時完成。 我認為,處理UI欄的最佳方法是分別訂閱每個映射的可觀察對象,它們都調用一個函數來增加UI計數欄變量並進行一些“完整性”測試,以允許您使用數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM