Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 防止来自NGRX效应的冗余API调用_Angular_Redux_Rxjs_Ngrx - Fatal编程技术网

Angular 防止来自NGRX效应的冗余API调用

Angular 防止来自NGRX效应的冗余API调用,angular,redux,rxjs,ngrx,Angular,Redux,Rxjs,Ngrx,我正在学习如何使用NGRX库将Redux架构集成到Angular应用程序中,遇到了一个有趣的问题,我对此感到好奇。我想知道当多个组件同时触发LoadApps操作时,如何防止对服务器的多个冗余API调用 我有以下减速器和效果: export function appsReducer(state = initialState, action: AppsActions): AppsState { switch (action.type) { case AppsActionTyp

我正在学习如何使用NGRX库将Redux架构集成到Angular应用程序中,遇到了一个有趣的问题,我对此感到好奇。我想知道当多个组件同时触发LoadApps操作时,如何防止对服务器的多个冗余API调用

我有以下减速器和效果:

export function appsReducer(state = initialState, action: AppsActions): AppsState {
    switch (action.type) {
        case AppsActionTypes.LoadApps:
            return {
                ...state,
                pending: true,
                data: []
            };

        case AppsActionTypes.LoadAppsSuccess:
            return {
                ...state,
                pending: false,
                data: action.payload
            };

        default:
            return state;
    }
}
从我的API加载应用程序对象列表的。如果我的angular应用程序中有两个同级组件,例如侧栏导航和顶栏导航组件,每个组件都需要应用程序列表,它们都会在其OnInit方法中触发LoadApps操作,从而导致对服务器的两个完全相同的API调用

如果效果在触发另一个api请求之前从状态获取pending boolean以确保它不是true,那么在我看来,在pending设置为true之前,对效果的第二个调用可能已经开始运行了


NGRX是否为此提供了某种机制?

尝试使用
排气图

@Effect()
loadApps = this.actions.pipe(
    ofType(AppsActionTypes.LoadApps),
    exhaustMap(() => this.appService.getApps()),
    map(res => [new LoadAppsSuccess(res)])
);
exhaustMap
将忽略任何传入事件,直到完成exhaustMap中的可观察事件

@Effect()
loadApps = this.actions.pipe(
    ofType(AppsActionTypes.LoadApps),
    exhaustMap(() => this.appService.getApps()),
    map(res => [new LoadAppsSuccess(res)])
);