angular - NgRx: 得到 'You provided ' undefined' where a stream is expected.'当调用有效的完整 Action 时

标签 angular typescript rxjs ngrx ngrx-store

我正在尝试执行 API 调用并将现有数据与现有数据合并(合并是在 addMissingData 中完成的)。
当我尝试调用时出现错误:

Uncaught TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

at subscribeTo (subscribeTo.js:27) at subscribeToResult (subscribeToResult.js:11) at MergeMapSubscriber._innerSub (mergeMap.js:59) at MergeMapSubscriber._tryNext (mergeMap.js:53) at MergeMapSubscriber._next (mergeMap.js:36) at MergeMapSubscriber.next (Subscriber.js:49) at MapSubscriber._next (map.js:35) at MapSubscriber.next (Subscriber.js:49) at CatchSubscriber._next (Subscriber.js:72) at CatchSubscriber.next (Subscriber.js:49)

 GetStepWiseMasterData$ = createEffect(() => this.actions$.pipe(
            ofType(MasterDataAction.getCustomerMasterData),
            switchMap((action) => {
                return this.dataService.GetDataAsync(action.stepEnum).pipe(
                    map((response) => {
                        return {
                            isSuccess: response.isSuccess,
                            newData: response.data,
                            data: action.data,
                        };
                    }),
                    mergeMap((response) => {
                        if (response.isSuccess) {
                            this.addMissingData(response.newData, action.data).then(result => {
                                return [DataAction.getCustomerDataComplete({ customerData: result })];
                            });
                        } else {
                            return [DataAction.getCustomerDataFailed({ customerData: {} })];
                        }
                    }),
                    catchError(() => EMPTY)
                );
            })
        ));

   async addMissingData(newMasterData: BusinessPartnerMasterDataVM, existingMasterData: BusinessPartnerMasterDataVM = {}): Promise<any> {
        const omitNullValues = masterDataObj => new Promise((resolve) => {
            // filter with property name and delete all properties that are null
            Object.keys(masterDataObj).filter(propertyName => masterDataObj[propertyName] === null).forEach(propertyName => delete(masterDataObj[propertyName]));
            resolve(masterDataObj);
        });
        const masterNew = await omitNullValues(newMasterData);
        const masterOld = await omitNullValues(existingMasterData);
        const ret = Object.assign({}, masterNew, masterOld);
        return ret;
    }

最佳答案

好像你的问题发生在这个区域,

mergeMap((response) => {
    if (response.isSuccess) {
        this.addMissingData(response.newData, action.data).then(result => {
            return [DataAction.getCustomerDataComplete({ customerData: result })];
        });
    } else {
        return [DataAction.getCustomerDataFailed({ customerData: {} })];
    }
})
这里没有任何返回if (response.isSuccess)条件分支。据我了解,您想调用两个 API
  • 第一个电话getCustomerMasterData
  • 然后使用 getCustomerMasterData 的结果,您要调用addMissingData

  • 我的建议是创建另一个函数来调用上面的 apis,然后使用管道。
    GetStepWiseMasterData$ = createEffect(() => this.actions$.pipe(
        ofType(MasterDataAction.getCustomerMasterData),
        switchMap((action) => {
            return from(this.combinedFunction(action)).pipe(
                map((result) => {
                    return { masterData: result };
                }),
                switchMap((result) => {
                    return [MasterDataAction.getCustomerDataComplete(result)];
                })
            );
        })
    ));
    
    async combinedFunction(action) {
        const response = await this.dataService.GetDataAsync(action.stepEnum).toPromise();
        if (!response.isSuccess) {
            return {};
        }
        return await this.addMissingData(response.newData, action.data);
    }
    
    from需要将 Promise 转换为可以从 rxjs 导入的 Observable ,或者您可以修改 combinedFunction返回一个 Observable。
    希望这有帮助:)

    关于angular - NgRx: 得到 'You provided ' undefined' where a stream is expected.'当调用有效的完整 Action 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63409991/

    相关文章:

    reactjs - 如何在 react-redux 中正确键入映射到 Prop 的 Action 创建者

    angular - 如何在 Angular 4 中使用 Observable 的操作符 forkJoin

    node.js - 如何使用 pm2 在远程服务器上部署 angular2 应用程序

    javascript - 如何使我的按钮(清除过滤器)仅在使用过滤器时出现

    angular - 如何在 Angular2 中使用@ViewChildren?

    Angular 2 输出 EventEmitter 不起作用

    Typescript:私有(private)类,对不同文件中同一模块中的类可见

    javascript - Ionic 2(点击)触发两次 iOS 10.3.1

    angular - Rxjs - 使用 observables 作为值重新映射对象

    Angular4如何使用flatMap链接forkJoin