Javascript tap未等待中后端服务调用的响应
在服务中使用tap运算符时如何订阅响应 有人知道如何解决这个问题吗Javascript tap未等待中后端服务调用的响应,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,在服务中使用tap运算符时如何订阅响应 有人知道如何解决这个问题吗 编辑(状态){ dataObj.val=状态; //状态为的呼叫邮政服务。。 这是服务 .更新(数据对象) .pipe(takeUntil(此.\n订阅$) .订阅(()=>{ //我想等到响应来自后端,然后导航到页面,这样我就可以在那里获取数据。 如果(res.status==‘Success’){ 这是路由器 .导航(['../../success']{ 这条路线, }) .然后(()=>{}); }否则{ this.lo
编辑(状态){
dataObj.val=状态;
//状态为的呼叫邮政服务。。
这是服务
.更新(数据对象)
.pipe(takeUntil(此.\n订阅$)
.订阅(()=>{
//我想等到响应来自后端,然后导航到页面,这样我就可以在那里获取数据。
如果(res.status==‘Success’){
这是路由器
.导航(['../../success']{
这条路线,
})
.然后(()=>{});
}否则{
this.location.back();
}
});
}
//秋田店服务
更新(
obj:任何,
):可观察<任何>{
返回此.service.update(obj).pipe(
延迟(800),
map((数据:RestfulResponse)=>data.data),
点击((数据:anny)=>{
this.store.update((状态)=>{
state.updateValue=data;//值未更新,正在导航到路由
});
}),
);
}
//邮政服务
更新(obj){
//邮电
}
按设计,点击
操作符处理在可观察管道上下文中不会发生的副作用。这意味着您的管道将永远不会等待点击
本身的结果。我不建议以这种方式使用它。在大多数情况下,我只使用tap
进行调试
如果您正在等待一个特定的状态更改,您应该创建一个单独的可观察对象,从您的存储中进行选择,以观察预期更改的状态
如果你想在事情发生时触发一个额外的动作,我建议使用ngrx效果来实现这一点
看看这篇文章,我在这里谈到了如何实现一个类似的用例:
您还应该努力设置应用状态更改的缩减器,而不是直接更新存储
将以下各项视为一个单独的关注点,您可以独立于其他关注点实施:
switchMap
处理HTTP调用,然后触发另一个动作来表示它完成了
编辑
这里有一个简单的例子。第一次触发名为APP_LOADED的操作时(从AppComponent),此效果会进行HTTP调用以从服务器获取数据,然后使用响应数据作为操作负载触发操作
实际的HTTP调用被委托给另一个服务,即HttpMyConfigDataService
,它只调用HttpClient
,并返回一个可观察的
@Injectable({
providedIn: 'root'
})
export class LoadMyConfigEffect {
constructor(
private httpMyConfigDataService: HttpMyConfigDataService,
private action$: Actions
) {
}
loadMyConfigData$ = createEffect(() => {
return this.action$.pipe(
filter((action) => action.type === 'APP_LOADED'),
take(1),
switchMap(() => this.httpMyConfigDataService.get().pipe(
map(data => {
return {type: 'MY_CONFIG_DATA_LOADED', payload: data};
}),
catchError(err => {
console.error('Error loading config data.', err);
return of({type: 'CONFIG_LOAD_ERROR', payload: err.message, isError: true);
})
))
);
});
}
谢谢你的回复。你能举个例子吗?如何添加switchmap?我正在使用akita store。添加了一个从服务器加载数据的效果示例添加了更多示例代码,展示了如何在不终止效果管道的情况下处理HTTP调用中的错误。