Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.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
Javascript tap未等待中后端服务调用的响应_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript tap未等待中后端服务调用的响应

Javascript tap未等待中后端服务调用的响应,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,在服务中使用tap运算符时如何订阅响应 有人知道如何解决这个问题吗 编辑(状态){ dataObj.val=状态; //状态为的呼叫邮政服务。。 这是服务 .更新(数据对象) .pipe(takeUntil(此.\n订阅$) .订阅(()=>{ //我想等到响应来自后端,然后导航到页面,这样我就可以在那里获取数据。 如果(res.status==‘Success’){ 这是路由器 .导航(['../../success']{ 这条路线, }) .然后(()=>{}); }否则{ this.lo

在服务中使用tap运算符时如何订阅响应

有人知道如何解决这个问题吗

编辑(状态){
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效果来实现这一点

看看这篇文章,我在这里谈到了如何实现一个类似的用例:

您还应该努力设置应用状态更改的缩减器,而不是直接更新存储

将以下各项视为一个单独的关注点,您可以独立于其他关注点实施:

  • 当用户进行编辑时,触发编辑操作
  • 减速器应根据编辑操作更新状态(例如,显示正在进行保存)
  • 触发编辑动作时,触发效果。应用程序应进行HTTP调用以保存更改,然后触发保存完成操作
  • 保存完成后,应触发路由器导航
  • 这将代码分成多个单元,这些单元易于独立测试和验证

    如果#1产生的动作被你的减速机消耗(#2),你也可以为#3创建一个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调用中的错误。