无法处理Observable.forkJoin()返回的json文件

时间:2017-07-19 21:03:16

标签: json angular observable fork-join

我正在使用Angular2和nodejs rest api。我必须为同一个任务执行一个或多个http请求,因此我使用Observable.forkJoin()等待所有这些任务完成。 我使用json解析方法映射结果,然后订阅此结果,但我不能像以前那样从结果中获取任何json属性。

我的服务方法返回Observable.forkJoin()本身:

public rename(file:MyFile, newName:string){
    let requests = new Array();
    for(let i=0; i<file.sources.length; i++){
        let url:string = this.serverUrl;
        if(src.name === "src1"){
            url += "rename/src1";
        } else if (src.name === "src2" ){
            url += "rename/src2";
        }
        requests[i] = this.http.get(url)
                  .map((res:Response) => res.json())
                  .catch(this.handleError);
    }
    return Observable.forkJoin(requests);
}

然后我在别处用另一种方法订阅它:

this.api.rename(this.selectedFile, newFileName).subscribe(
    rep => {
      // The editor tells me "Property 'name' doesn't exist on type '{}'."
      console.log(rep[0].name); 
    },
    err => { console.error(err); }
  );

服务器正确回应我问的数据。 rep [0]设置正确,如下所示:

Object {name: "res.png", id: "HyrBvB6H-", size: 0, type: "", isShared: false…}

我认为这是打字问题。通常,通过简单的http.get请求,它会返回一个&#39; any&#39;宾语。在这里它会返回一个&#39; [] {}&#39;宾语。 res[0]是&#39; {}&#39;对象,我无法获得它的json属性。

我正确使用Observer.forkJoin()吗?我错过了什么吗?

提前感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

如果编辑器抱怨并且代码执行时错误,则可能是输入问题。您可以将rename()的返回类型设置为:

public rename(file:MyFile, newName:string): Observable<any[]> { }

这应该允许您访问内部结果的属性,例如name

或者您可以在rep中键入subscribe()数组any[]

this.api.rename(this.selectedFile, newFileName).subscribe(
    (rep: any[]) => {
      console.log(rep[0].name); 
    },
    err => { console.error(err); }
);

如果所有其他方法都失败或无法解决您的解决方案,您可以使用类型断言将rep视为any[]

this.api.rename(this.selectedFile, newFileName).subscribe(
    rep => {
      const responses = rep as any as any[];
      console.log(responses[0].name); 
    },
    err => { console.error(err); }
);

如果结果结构在不同的端点上保持一致,最好的做法是创建一个接口/类来替换any[]

希望这有帮助!

答案 1 :(得分:1)

http.get是一个异步过程,所以你不能使用for循环 从语法上讲,你必须将gets嵌套在forkJoin中,所以你有这样的东西。你可以先使用for循环来构建一个url数组。:

return Observable.forkJoin([
    this.http.get(url[1]).map(res => res.json()),
    this.http.get(url[2]).map(res => res.json()),
    this.http.get(url[3]).map(res => res.json())
  ])
  .map((data: any[]) => {
     this.part1 = data[0];
     this.part2 = data[1];
     this.part3 = data[2];
  });

我想知道你是否可以做这样的事情。我明天会试一试。已经晚了..

return Observable.forkJoin(let req = [];
  for(let i=0; i<file.sources.length; i++){
      req[i] = this.http.get(url[i]).map(res => res.json())
  }
)