ngrx4效果中的多个动作 - > forkJoin无法按预期工作

nos*_*sTa 6 rxjs ionic-framework ngrx angular

我试图调用多个操作并等待它们完成,直到我返回SYNC_SUCCESS操作并关闭加载屏幕.但我无法让它发挥作用.

有什么建议我在这里做错了吗?

AppEffect:

@Effect()
syncMasterData$ = this.actions$
    .ofType<AppActions.SyncMasterdata>(AppActions.SYNC_MASTERDATA)
    .mergeMap(() => 
    {
        return Observable.forkJoin(
            Observable.of(new BarcodeConfigActions.Sync)
        ).map(() => new AppActions.SyncingSuccess);
    })
Run Code Online (Sandbox Code Playgroud)

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)
    })
Run Code Online (Sandbox Code Playgroud)

AppAction:

export class SyncMasterdata implements Action
{
    readonly type = SYNC_MASTERDATA;
}
Run Code Online (Sandbox Code Playgroud)

BarcodeConfigAction:

export class Sync implements Action
{
    readonly type = SYNC;
}
Run Code Online (Sandbox Code Playgroud)

这样就不会调用barcodeconfigeffect - > sync.如果我删除forkjoin并发布Observable.of(新的BarcodeConfigActions.Sync)它可以工作,但我无法分派更多的动作.

谢谢 :)

amu*_*amu 1

如果我正确理解问题,您似乎想确保BarcodeConfigActions.SyncSuccess(在 BarcodeConfigEffect 中)在您的(在 AppEffect 中)之前调度AppActions.SyncingSuccess。这是为了确保您已收到getBarcodeConfig

\n\n

您的解决方案的问题在于您正在 forkJoining 一个操作 ,BarcodeConfigActions.Sync然后在AppActions.SyncingSuccess返回之前将该操作映射到 。这意味着BarcodeConfigActions.Syncnever 会在 observable 上发出actions$,这是您在BarcodeConfigEffect.

\n\n

如果您的syncMasterData$effects\xc2\xb4 唯一的逻辑是确保调用BarcodeConfigActions.SyncSuccessBEFORE AppActions.SyncingSuccess,也许只需在您的 ? 中调度两个操作 forkJoined BarcodeConfigEffect

\n\n
@Effect() sync$ = this.actions$\n.ofType<BarcodeConfigActions.Sync>(BarcodeConfigActions.SYNC)\n.mergeMap(() => this.apiProvider.getBarcodeConfig())\n.map((barcodeConfigs: BarcodeConfig[]) =>\n{\n    let barcodeConfigState = <barcodeConfig.State>{};\n    barcodeConfigState.tenant = "COOKIE";\n    barcodeConfigState.barcodeConfig = barcodeConfigs;\n    /* NEW RETURN */\n    return Observable.forkJoin(\n                new AppActions.SyncingSuccess(),\n                new BarcodeConfigActions.SyncSuccess({ barcodeConfigs: barcodeConfigState }));\n})\n.catch((error) =>\n{\n    this._store.dispatch(new AppActions.UnexpectedError(error));\n    return Observable.of(new BarcodeConfigActions.SyncFailed)\n})\n
Run Code Online (Sandbox Code Playgroud)\n