Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
Typescript Angular4返回可观测值与嵌套可观测值_Typescript_Foreach_Angular5_Observable - Fatal编程技术网

Typescript Angular4返回可观测值与嵌套可观测值

Typescript Angular4返回可观测值与嵌套可观测值,typescript,foreach,angular5,observable,Typescript,Foreach,Angular5,Observable,我有一个服务,它返回一个包含对象集合的可观察对象。最初的web调用返回一个集合,但是在项目集合中,我需要进行一个补充调用来检索一些额外的数据。结果应该是使用这两个响应生成的新对象 代码看起来有点像这样: let result: Array<InvitationModel> = new Array<InvitationModel>(); this.apiService.getInvitations().map((invitations : Array<Invitat

我有一个服务,它返回一个包含对象集合的可观察对象。最初的web调用返回一个集合,但是在项目集合中,我需要进行一个补充调用来检索一些额外的数据。结果应该是使用这两个响应生成的新对象

代码看起来有点像这样:

let result: Array<InvitationModel> = new Array<InvitationModel>();

this.apiService.getInvitations().map((invitations : Array<InvitationResponse>) => {
     invitations.forEach(inv => {
      this.apiService.getInvitationData(inv).map((data: DataResponse) => {
      result.push(new InvitationModel(inv, data));        
    });
});

return result;
return this.apiService.getInvitations().switchMap((invitations: Array<InvitationResponse>) => {

    let result: Array<InvitationModel> = new Array<InvitationModel>();
    return Observable.forkJoin(...invitations.map(inv => {
        this.apiService.getInvitationData(inv).map((data: DataResponse) => {
            result.push(new InvitationModel(inv, data));
        });
    })).map(() => {
        return result;
    });
});
let result:Array=new Array();
this.apiService.getinvestments().map((邀请:数组)=>{
邀请。forEach(inv=>{
this.apiService.getInvitationData(inv.map)((数据:DataResponse)=>{
push(新的邀请模型(inv,data));
});
});
返回结果;
这不起作用,我理解,但我不确定写它的正确方法,因此我只能在循环完成后返回结果


任何建议都将不胜感激。

您正在寻找的是Rxjs.Observable.switchMap方法(),使用此方法,您将等待switchMap块中的所有Observable都被解析(您基本上切换到一个新的Observable)。此外,由于可观察部分是异步执行的,因此结果数组的方式也不起作用,这意味着您应该从函数返回一个可观察部分,并在外部订阅以检索数据

您的示例可以如下所示:

let result: Array<InvitationModel> = new Array<InvitationModel>();

this.apiService.getInvitations().map((invitations : Array<InvitationResponse>) => {
     invitations.forEach(inv => {
      this.apiService.getInvitationData(inv).map((data: DataResponse) => {
      result.push(new InvitationModel(inv, data));        
    });
});

return result;
return this.apiService.getInvitations().switchMap((invitations: Array<InvitationResponse>) => {

    let result: Array<InvitationModel> = new Array<InvitationModel>();
    return Observable.forkJoin(...invitations.map(inv => {
        this.apiService.getInvitationData(inv).map((data: DataResponse) => {
            result.push(new InvitationModel(inv, data));
        });
    })).map(() => {
        return result;
    });
});
返回此.apiService.getinvestments().switchMap((邀请:数组)=>{
让结果:数组=新数组();
返回可观察的.forkJoin(…investments.map(inv=>{
this.apiService.getInvitationData(inv.map)((数据:DataResponse)=>{
push(新的邀请模型(inv,data));
});
})).map(()=>{
返回结果;
});
});
快速解释:

正如我在上面使用
.switchMap
所说的,您正在等待,直到您的子对象被解析

使用
investments.map(inv=>{
可以为子操作创建一个带有可观察对象的数组


使用
Observable.forkJoin(
您将数组中的所有观察值组合到一个单独的观察值以等待。

您正在寻找的是Rxjs.Observable.switchMap方法()使用此方法,您将等待直到switchMap块中的所有观察值都被解析(您基本上切换到一个新的观察值)。此外,由于可观察部分是异步执行的,因此结果数组的方式也不起作用,这意味着您应该从函数返回一个可观察部分,并在外部订阅以检索数据

您的示例可以如下所示:

let result: Array<InvitationModel> = new Array<InvitationModel>();

this.apiService.getInvitations().map((invitations : Array<InvitationResponse>) => {
     invitations.forEach(inv => {
      this.apiService.getInvitationData(inv).map((data: DataResponse) => {
      result.push(new InvitationModel(inv, data));        
    });
});

return result;
return this.apiService.getInvitations().switchMap((invitations: Array<InvitationResponse>) => {

    let result: Array<InvitationModel> = new Array<InvitationModel>();
    return Observable.forkJoin(...invitations.map(inv => {
        this.apiService.getInvitationData(inv).map((data: DataResponse) => {
            result.push(new InvitationModel(inv, data));
        });
    })).map(() => {
        return result;
    });
});
返回此.apiService.getinvestments().switchMap((邀请:数组)=>{
让结果:数组=新数组();
返回可观察的.forkJoin(…investments.map(inv=>{
this.apiService.getInvitationData(inv.map)((数据:DataResponse)=>{
push(新的邀请模型(inv,data));
});
})).map(()=>{
返回结果;
});
});
快速解释:

正如我在上面使用
.switchMap
所说的,您正在等待,直到您的子对象被解析

使用
investments.map(inv=>{
可以为子操作创建一个带有可观察对象的数组


使用
Observable.forkJoin(
你将数组中的所有观察值组合成一个单独的观察值等待。

完美。可以直接将此答案复制到我的代码中,并且成功了。如果可以,我会为此答案投票不止一次!完美。可以直接将此答案复制到我的代码中,并且成功了。如果可以,我会为此答案投票不止一次!