Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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 角度/w ngrx-连续API调用_Angular_Redux_Ngrx - Fatal编程技术网

Angular 角度/w ngrx-连续API调用

Angular 角度/w ngrx-连续API调用,angular,redux,ngrx,Angular,Redux,Ngrx,我正在Angular 4应用程序中实现ngrx。redux相关部分的代码结构基于ngrx repo()的示例应用程序。现在我想知道如何实现这样的功能: 我有某种实体的形式 在提交时,我向API发送POST请求,请求中只包含该实体的名称 作为响应,我获取新创建实体的id 紧接着,我想发送第二个请求,其中包含表单的其余值和我刚得到的id 我应该将第二个请求放在何处以及如何放置?如何实现连续的API调用取决于调用的内聚性。 我的意思是,您是否将这两个调用视为一个“事务”,其中两个请求都必须成功才能成功

我正在Angular 4应用程序中实现ngrx。redux相关部分的代码结构基于ngrx repo()的示例应用程序。现在我想知道如何实现这样的功能:

  • 我有某种实体的形式
  • 在提交时,我向API发送POST请求,请求中只包含该实体的名称
  • 作为响应,我获取新创建实体的id
  • 紧接着,我想发送第二个请求,其中包含表单的其余值和我刚得到的id

  • 我应该将第二个请求放在何处以及如何放置?

    如何实现连续的API调用取决于调用的内聚性。
    我的意思是,您是否将这两个调用视为一个“事务”,其中两个请求都必须成功才能成功更改您的状态

    显然,如果第一个请求失败,第二个请求将无法启动,因为它依赖于第一个请求中的数据。但是

    当第一个请求成功而第二个请求失败时会发生什么

    您的应用程序是否可以仅使用第一个请求中的
    id
    而不使用第二个请求继续工作,或者是否会以不一致的状态结束


    我将介绍两种情况:

  • 场景1:当任一请求失败时,您将其视为整个“事务”失败,因此不关心哪个请求失败
  • 场景2:当请求1失败时,将不执行请求2。当请求2失败时,请求1仍将被视为成功
  • 情景1 因为两个请求都必须成功,所以您可以查看两个请求,就像它们只是一个请求一样。 在这种情况下,我建议将连续调用隐藏在服务中(这种方法并不特定于ngrx/redux,它只是普通的RxJs):

    @Injectable()
    出口邮递服务{
    私有API_URL1=http://your.api.com/resource1';
    私有API_URL2=http://your.api.com/resource2';
    构造函数(私有http:http){}
    postCombined(formValues:{name:string,age:number}):可观察的{
    返回this.http.post(this.API_URL1,{name:formValues.name})
    .map(res=>res.json())
    .switchMap(post1result=>
    this.http.post(this.API_URL2{
    /*访问post1result和formValues*/
    id:post1result.id,
    年龄:formValues.age,
    时间戳:新日期()
    })
    .map(res=>res.json())
    .mergeMap(post2result=>Observable.of({
    /*访问post1result和post2result*/
    id:post1result.id,
    名称:post1result.name,
    年龄:2岁后结果年龄,
    时间戳:post2result.timestamp
    })
    );
    }
    }
    
    现在,您可以像ngrx示例应用程序中显示的任何其他服务方法一样使用
    后组合
    -方法

    • 如果任何一个请求失败,服务将抛出一个错误,您可以捕获并处理该错误
    • 如果两个请求都成功,您将返回
      mergeMap
      中定义的数据。如您所见,可以从两个请求响应返回合并数据
    情景2 通过这种方法,您可以区分两个请求的结果,并在其中一个请求失败时做出不同的反应。 我建议将这两个调用分解为独立的操作,这样您就可以独立地减少每个案例

    首先,该服务现在有两个独立的方法(这里没有什么特别的):

    邮政服务.ts

    @Injectable()
    出口邮递服务{
    私有API_URL1=http://your.api.com/resource1';
    私有API_URL2=http://your.api.com/resource2';
    构造函数(私有http:http){}
    post1(formValues:{name:string}):可观察{
    返回this.http.post(this.API_URL1,formValues).map(res=>res.json());
    }
    post2(receivedId:number,formValues:{age:number}):可观察{
    返回this.http.post(this.API_URL2{
    id:receivedId,
    年龄:formValues.age,
    时间戳:新日期()
    })
    .map(res=>res.json());
    }
    }
    
    接下来,为两个请求定义请求、成功和失败操作:

    post.actions.ts

    从'@ngrx/store'导入{Action};
    导出常量POST1_请求='POST1_请求';
    导出常量POST1_SUCCESS='POST1_SUCCESS';
    导出常量POST1_FAILURE='POST1_FAILURE';
    export const POST2_REQUEST='POST2_REQUEST';
    导出常量POST2_SUCCESS='POST2_SUCCESS';
    导出常量POST2_FAILURE='POST2_FAILURE';
    导出类Post1RequestAction实现操作{
    只读类型=POST1\U请求;
    构造函数(公共负载:{name:string,age:number}){}
    }
    导出类Post1SuccessAction实现操作{
    只读类型=POST1\u成功;
    构造函数(公共负载:{id:number}){}
    }
    导出类Post1FailureAction实现操作{
    只读类型=POST1\U故障;
    构造函数(公共错误:any){}
    }
    导出类Post2RequestAction实现操作{
    只读类型=POST2_请求;
    构造函数(公共负载:{id:number,name:string,age:number}){}
    }
    导出类Post2SuccessAction实现操作{
    只读类型=POST2_成功;
    构造函数(公共有效负载:any){}
    }
    导出类Post2FailureAction实现操作{
    只读类型=POST2_故障;
    构造函数(公共错误:any){}
    }
    导出类型操作
    =后1请求
    |1成功后
    |1失败后的行动
    |后2请求
    |2成功后
    |后2失败行动
    
    现在我们可以定义两种效果,它们将在发送请求操作时运行,然后根据se的结果发送成功或失败操作