如何正确地从 effect/action 链接调度其他操作

how to properly chain dispatch other actions from effect/action

我有一个动作 A(被副作用拦截),在 A 完成处理后触发另外两个动作。

目前,我正在使用 rxjs 中的 do() 运算符,例如:

this._action$.ofType('TYPE_A').switchMap(action => a_http_call())
    .distinctUntilChanged()
    .do(data => setTimeout(() => this._store.dispatch({type: 'TYPE_B'}), 1))
    .do(data => setTimeout(() => this._store.dispatch({type: 'TYPE_C'}), 1))
    //.some()
    //.more()
    //.process()
    //.done()
    ;

我使用 setTimeout() 调用来(好吧,希望)将操作 B 从嵌套在 A 的进程中间。 AND,在两个 do()s

之后继续 A 的过程

这个练得好吗?是否有触发其他操作的首选模式?

使用setTimeout()在处理这个用this._action$创建的Observable时不会阻塞执行线程,但是如果它做了一些计算密集型的事情,它无论如何都会在稍后执行这个闭包时阻塞线程并可能导致延迟。

但是我不认为 this._store.dispatch 是阻塞调用。这意味着它在内部异步调用一些请求(或类似的东西)所以你可能甚至不需要用 setTimeout().

包装它

使用 .do() 可能会产生副作用,请注意 .do()subscribe() 不同,因为它可能根本不会被调用,直到至少有一个观察者已订阅(取决于您使用的是 "hot" 还是 "cold" Observables)。

这个问题是关于旧的 RXJS 库的,不再有效。现在正确的方法很可能是使用 pipe().


旧的和过时的答案仅供记录。

找到原生的接收方式here, which was pointed out by this question