一种解决方案是将网络在线/离线添加到状态(或者使其作为可观察流可用)。然后,您可以在需要忽略脱机时的操作的效果中使用takeUntil
。
在上面的例子中的精神,你可以尝试这样的事情(未经测试,但应接近):
// NOTE: This effect listens for `LOAD_BOOKS` command actions, and emits the
// `PROGRESS` and either `LOAD_BOOKS_SUCCESS` or `LOAD_BOOKS_FAILURE` event actions
// that the reducers will listen for.
@Effect()
loadBooksWhenOnline$ = this.actions$
.ofType('LOAD_BOOKS')
.map(action => action.payload)
.withLatestFrom(this.store$)
.filter(([payload, state]) => state.network.status === 'online')
.switchMap(([payload, state]) => {
const networkOffline$ = this.actions$.ofType('NETWORK')
.filter(action => action.payload === 'offline');
const someOtherReasonToCancel$ = this.actions$.ofType('CANCEL');
const stop$ = Observable.merge(networkOffline$, someOtherReasonToCancel$);
return Observable.concat(
Observable.of({ type: 'PROGRESS', payload: { isLoading: true } }),
this.bookService.getBooks$(payload)
.map(books => ({ type: 'LOAD_BOOKS_SUCCESS', payload: books }))
.catch(err => Observable.of({ type: 'LOAD_BOOKS_FAILURE', payload: { payload, err })
.takeUntil(stop$),
Observable.of({ type: 'PROGRESS', payload: { isLoading: false } }),
);
})
.observeOn(async); // may want this, depending on how your actions interact
// elsewhere in reducerville
export function reducer(state, action) {
switch (action.type) {
case 'LOAD_BOOKS_SUCCESS':
return reduceLoadBooksSuccessAction(state, action);
case 'LOAD_BOOKS_FAILURE':
return reduceLoadBooksFailureAction(state, action);
case 'PROGRESS':
return Object.assign({}, state, {
progress: Object.assign({}, state.progress, action.payload)
});
// ...
default:
return state;
}
}
有最初的过滤器检查与国家只是为了确保你实际上是在线,然后再通过takeUntil
进入离线状态。我还添加了一个额外的CANCEL操作,只是为了说明如何停止效果的原因有很多。另外,上面的例子假定一个模型,其中处理'请求'动作(即命令)和减速器是处理'结果'动作(即事件)的纯函数。
更新2:好的,我添加了一个简单的isLoading
进度标志与相应的reducer,根据要求。具体而言,Observable.concat
调用的添加包含了isLoading
状态更改的书籍服务查询。进度操作也可以包含其他进度标志,并且此示例仅更新isLoading
属性。
你的意思是,['filter'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-filter)? – paulpdaniels
@paulpdaniels不,我想要一些事情,如果一个行动派遣,然后从流中删除此操作(没有其他效果或减速器应该对此行动作出反应) – Daskus
我的理解是,影响接收已* *已*的行动分发到商店,因此当没有网络连接时,您不能使用效果来阻止LOAD_BOOKS和CREATE_BOOK行为的传播。效应是行动的来源;他们不是行为过滤器。 – cartant