我试图调用多个 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.SyncSuccessAppActions.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)
})

10-06 00:10