Rxjs OR 运算符

Rxjs OR operator

我正在尝试使用 rxjs 实现或运算符。 is Race 函数用于 OR 运算符。 代码示例:

export function saveComment(action$) {
   return race(
            action$.ofType(COMMENT.SAVE),
            action$.ofType(COMMENT.DELETE)
         )
       .map((action) => action.payload)
       .flatMap((data)=> commentService.saveComment(data.leadId, data.comment))
       .map((resp)=> SaveCommentSucceed(resp.leadId, resp.comments))
       .do((res)=>new Comments().injectComments(res.payload.leadId, res.payload.comments));
}

根据问题判断有点困难,但看起来您正试图从每个可观察值中发出值并继续接收排放,对顺序没有偏好要么发生排放?

我建议查看 merge 运算符。它的行为类似于逻辑 OR,每当一个 OR 传递给它的其他 observables 发出时发出。

Race 将仅发出 它从传递给它的 observable 接收到的第一个 发射,然后它就会完成。

如果您想继续监听发出的值而不关心顺序,请使用合并。代码看起来类似于:

export function saveComment(action$) {
    return Observable
        .merge(
            action$.ofType(COMMENT.SAVE),
            action$.ofType(COMMENT.DELETE)
        )
        .map((action) => action.payload)
        .flatMap((data) => commentService.saveComment(data.leadId, data.comment))
        .map((resp) => SaveCommentSucceed(resp.leadId, resp.comments))
        .do((res) => new Comments().injectComments(res.payload.leadId, res.payload.comments));
}

如果您使用的 Rxjs 版本 (>= 5.5) 包含 pipeable operators,代码将如下所示:

export function saveComment(action$) {
    return merge(
            action$.ofType(COMMENT.SAVE),
            action$.ofType(COMMENT.DELETE)
        )
        .pipe(
            map((action) => action.payload),
            flatMap((data) => commentService.saveComment(data.leadId, data.comment)),
            map((resp) => SaveCommentSucceed(resp.leadId, resp.comments)),
            tap((res) => new Comments().injectComments(res.payload.leadId, res.payload.comments))
        );
}

如果您想停止 在其中一个可观察对象发出后收听,请继续使用 race。

您可以在 learn-rxjs.

中找到更多关于 Rxjs Observables 和 Operators 的信息