Observable有一个do if运算符吗?

时间:2017-10-31 00:24:49

标签: angular rxjs observable

我的情况是我正在打开一个对话框,只有当对话框observable返回switchMap值时才想true到另一个observable,否则,显示错误并停止以下操作。

目前我有以下内容:

   this.dilog.open(DialogComponent)
    .afterClosed()
    .takeUntil(this.end$)
    .do(item => {
      if (!item) {
        this.error = 'Please accept the agreement to continue.'
        this.isSubmitting = false;
      }
    })
    .filter(item => !!item)
    .switchMap(item => anotherObservable)

我想提高此代码的可读性。

1 个答案:

答案 0 :(得分:1)

我假设您没有使用RxJS的5.5版本,这让您更轻松create your own operators。以下是在几个月的时间内浏览代码时希望提高可读性的功能:

// source: source observable
// onError: function to execute on error
// onSuccess: observable to switchMap to
function showErrorOrSwitchMap(source, onError, onSuccess) {
    return source
        .do(item => {
            if (!item) {
                onError();
            }
        })
        .filter(item => !!item)
        .switchMap(item => onSuccess)
}

// USAGE
showErrorOrSwitchMap(
    this.dilog.open(DialogComponent)
        .afterClosed()
        .takeUntil(this.end$),
    function() {
        this.error = 'Please accept the agreement to continue.'
        this.isSubmitting = false;
    },
    anotherObservable
); // You can continue the observable chain here if you want

这只是你的代码,在函数内移动。虽然它不会改变您的原始代码,但它(希望如此)使其在使用该函数时更具可读性。