Angular 如何将两种不同的状态从我的ngrx效果传递到我的服务功能?

Angular 如何将两种不同的状态从我的ngrx效果传递到我的服务功能?,angular,rxjs,ngrx,ngrx-effects,Angular,Rxjs,Ngrx,Ngrx Effects,我有一个effects函数,试图将数据从分派的操作传递到服务中的一个函数,还有一个单独的选择器,但是我在RXJS语法中迷失了方向。我很确定我没有正确地映射数据。请参阅相关代码 //影响 updateCohort$ = createEffect(() => this.actions$.pipe( ofType(getCohortActions.updateActiveCohort.type), withLatestFrom(this.store.pi

我有一个effects函数,试图将数据从分派的操作传递到服务中的一个函数,还有一个单独的选择器,但是我在RXJS语法中迷失了方向。我很确定我没有正确地映射数据。请参阅相关代码

//影响

 updateCohort$ = createEffect(() =>
    this.actions$.pipe(
        ofType(getCohortActions.updateActiveCohort.type),
        withLatestFrom(this.store.pipe(select(activeCohort))),
        map(([action, selector ]) => (
            this.cohortFeaturesServices.updateCohorts(action, selector)
        )),
//服务

public updateCohorts(action, selector): Observable<any> {
    const url = `api/services/cohorts/frontend/`;

    return this.http.patch(`${url}/${selector.id}/`, action.changes);
}
publicUpdateShorts(操作、选择器):可观察{
const url=`api/services/cohors/frontend/`;
返回这个.http.patch(`${url}/${selector.id}/`,action.changes);
}
VisualStudio代码强调了整个函数,我在控制台中遇到以下错误

类型“Observable>”无法分配给类型“Observable”。 类型“Observable”中缺少属性“type”,但类型“Action”中需要属性“type”


如何修复我的效果并成功地将我的操作和选择器传递给我的服务调用?

您需要使用
switchMap/mergeMap/concatMap/defaustmap
来“unbox”从HTTP服务->switchMap->
map
的结果观察到操作,例如您的效果必须返回操作(例如,它只是动作分派的默认效果)

此外,我建议API方法将更改作为参数,而不是操作

updateCohort$ = createEffect(() =>
    this.actions$.pipe(
        ofType(getCohortActions.updateActiveCohort.type),
        withLatestFrom(this.store.pipe(select(activeCohort))),
        exhaustMap(([action, cohort]) => this.cohortFeaturesServices.updateCohorts(action, cohort).pipe(

        )),
        map((response) => ({
            type: getCohortActions.updateActiveCohortSuccess.type, // success action
            success: response
        })),
        catchError((err) => of(getCohortActions.updateActiveCohortError(err))) // error action
    )
)
updateShort$=createEffect(()=>
此.actions$管道(
类型(getCohortActions.UpdateActiveShort.type),
withLatestFrom(this.store.pipe(select(activecourt))),
开关映射(([动作,队列])=>
this.cohortFeaturesServices.UpdateShorts(action.changes,队列)
),
映射((结果:CohortUpdateResponse)=>successCohortUpdateAction())
)
)
公共更新队列(更改:部分,队列:队列):可观察{
const url=`api/services/cohors/frontend/`;
返回此.http.patch(`${url}/${court.id}/`,更改);
}
像这样的

p.S.添加了一些“发明”类型,以显示正在发生的事情以及发生在哪里

p.S.S并没有检查代码中是否有拼写错误,比如在回答窗口中写下的答案


德国劳埃德船级社:)

对于任何其他人来说,他们可能会遇到与我解决的问题相同的问题。我没有回复一个动作

updateCohort$ = createEffect(() =>
    this.actions$.pipe(
        ofType(getCohortActions.updateActiveCohort.type),
        withLatestFrom(this.store.pipe(select(activeCohort))),
        exhaustMap(([action, cohort]) => this.cohortFeaturesServices.updateCohorts(action, cohort).pipe(

        )),
        map((response) => ({
            type: getCohortActions.updateActiveCohortSuccess.type, // success action
            success: response
        })),
        catchError((err) => of(getCohortActions.updateActiveCohortError(err))) // error action
    )
)

使用我的答案调试错误,尽管我可以直接告诉您,您没有返回
操作
,效果是
updateCohort$
。使用
{dispatch:false}
指示效果仅用于副作用(即不需要进一步的操作/状态更改),或返回
可观察的
(在管道内使用
映射
映射到成功操作,
捕获错误
映射到的
错误操作
用于保持正确types@AndrewAllen谢谢你的回复。我以前确实遇到过这个答案,而且我一直在使用它。不幸的是,当我删除“createEffect”时,没有突出显示任何内容,所以我不确定如何解决这个问题。这是因为没有编码错误,但就像我说的效果贴图ac操作的异常(最常见的是对其成功/失败变体的潜在失败操作)或仅在这种情况下是显式的副作用
{dispatch:false}
是必需的。阅读ngrx效果并记住此图表。我明天将发布答案并更新我的链接答案。这不是一个好方法,我们使用效果呼叫API。谢谢,我最终找到了答案。我没有返回操作。你的答案很有帮助。