RxJS返回空的承诺,但继续链

时间:2017-11-19 13:44:08

标签: angular promise rxjs observable

我有一个需要根据用户输入调用的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中处理这种情况?

1 个答案:

答案 0 :(得分:4)

问题是您只使用以下内容处理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: () => { ... }
})