【问题标题】:RxJS return empty promise but continue chainRxJS 返回空承诺但继续链
【发布时间】:2017-11-19 13:44:08
【问题描述】:

我有一个 http 服务,我需要根据用户的输入来调用它。

saveImage(): Observable<Photo> {
    if (!this.squaredImage) {
        return Observable.of();
    }

    this.photoCreateDto = {
        sourcePhoto: this.sourceImage,
        squaredPhoto: this.squaredImage,
        fileExtension: this.fileExtension
    };

    return this.photoService.createPhoto(this.photoCreateDto);
}

我从另一个保存函数调用saveImage

save() {
    this.saveImage().subscribe((newPhoto: Photo) => {

         .. never gets here

    });
}

如果this.squaredImage 没有值并且返回空承诺,则链结束。如果调用createPhoto 服务,它会继续。我也尝试过返回Observable.empty()。在 rxjs 中如何处理这种情况?

【问题讨论】:

  • 那么你期望会发生什么?
  • 我希望每次都调用saveImage 的回调。我认为我错误地将其与 then 承诺链进行了比较,并试图返回一个空承诺。
  • 然后你需要返回一个发出值的可观察对象。不是空的。每个发出的事件都会调用订阅回调。所以如果你从不发出一个事件,它就永远不会被调用。
  • @JBNizet Observable.of 不构造一个只有一个值的可观察对象吗?
  • @Bergi 如果您将参数传递给方法,它会这样做。

标签: angular promise rxjs observable


【解决方案1】:

问题是您只处理next 通知:

this.saveImage().subscribe((newPhoto: Photo) => { ... });

...而Observable.of()Observable.empty() 不发出任何next(它们只是发送complete 通知)。

所以您可以做的一件事是发出例如null,然后在订阅者中检查您发送的值:

saveImage(): Observable<Photo> {
    if (!this.squaredImage) {
        return Observable.of(null);
    }
    ...
}

...

this.saveImage().subscribe((newPhoto: Photo) => {
    if (newPhoto === null) {
        // ...
    }

    // ...
})

或者您可以同时收听nextcomplete 通知(但请注意,当您返回this.photoService.createPhoto 时,可能还会发送complete 通知):

this.saveImage().subscribe({
  next: (newPhoto: Photo) => {...}
  complete: () => { ... }
})

【讨论】:

  • 解释清楚!
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 2018-01-26
  • 2021-08-11
  • 2023-01-27
  • 1970-01-01
  • 2018-02-15
  • 2018-08-24
相关资源
最近更新 更多