我试图调用多个 Action 并等待它们完成,直到我返回SYNC_SUCCESS Action 并关闭加载屏幕。但是我无法使它正常工作。
有什么建议我在这里做错了吗?
AppEffect:
@Effect()
syncMasterData$ = this.actions$
.ofType<AppActions.SyncMasterdata>(AppActions.SYNC_MASTERDATA)
.mergeMap(() =>
{
return Observable.forkJoin(
Observable.of(new BarcodeConfigActions.Sync)
).map(() => new AppActions.SyncingSuccess);
})
BarcodeConfigEffect
@Effect() sync$ = this.actions$
.ofType<BarcodeConfigActions.Sync>(BarcodeConfigActions.SYNC)
.mergeMap(() => this.apiProvider.getBarcodeConfig())
.map((barcodeConfigs: BarcodeConfig[]) =>
{
let barcodeConfigState = <barcodeConfig.State>{};
barcodeConfigState.tenant = "COOKIE";
barcodeConfigState.barcodeConfig = barcodeConfigs;
return new BarcodeConfigActions.SyncSuccess({ barcodeConfigs: barcodeConfigState });
})
.catch((error) =>
{
this._store.dispatch(new AppActions.UnexpectedError(error));
return Observable.of(new BarcodeConfigActions.SyncFailed)
})
AppAction:
export class SyncMasterdata implements Action
{
readonly type = SYNC_MASTERDATA;
}
BarcodeConfigAction:
export class Sync implements Action
{
readonly type = SYNC;
}
这样一来,barcodeconfigeffect-> sync将不会被调用。如果我删除了forkjoin并仅发布了Observable.of(new BarcodeConfigActions.Sync),它可以工作,但是我不能调度更多的 Action 。
谢谢 :)
最佳答案
如果我正确理解了该问题,似乎您想确保在BarcodeConfigActions.SyncSuccess
(在AppEffect中)之前分派(dispatch)了AppActions.SyncingSuccess
(在BarcodeConfigEffect中)。这是为了确保您已收到getBarcodeConfig
?
解决方案的问题是,您正在forkJoining一个 Action BarcodeConfigActions.Sync
,然后在该 Action 返回给AppActions.SyncingSuccess
之前将其映射。这意味着BarcodeConfigActions.Sync
永远不会在actions$
可观察对象上发出,这是您在BarcodeConfigEffect
中使用的可观察对象。
如果您的syncMasterData$
效果唯一的逻辑是要确保BarcodeConfigActions.SyncSuccess
在AppActions.SyncingSuccess
之前被称为,也许只是分派(dispatch)两个 Action forkJoined在BarcodeConfigEffect
中?
@Effect() sync$ = this.actions$
.ofType<BarcodeConfigActions.Sync>(BarcodeConfigActions.SYNC)
.mergeMap(() => this.apiProvider.getBarcodeConfig())
.map((barcodeConfigs: BarcodeConfig[]) =>
{
let barcodeConfigState = <barcodeConfig.State>{};
barcodeConfigState.tenant = "COOKIE";
barcodeConfigState.barcodeConfig = barcodeConfigs;
/* NEW RETURN */
return Observable.forkJoin(
new AppActions.SyncingSuccess(),
new BarcodeConfigActions.SyncSuccess({ barcodeConfigs: barcodeConfigState }));
})
.catch((error) =>
{
this._store.dispatch(new AppActions.UnexpectedError(error));
return Observable.of(new BarcodeConfigActions.SyncFailed)
})