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

Can't handle json files returned by Observable.forkJoin()

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

我的服务方法 returns 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 请求,它 returns 一个 'any' 对象。这里 returns 一个“[]{}”对象。 res[0] 是一个“{}”对象,我无法获取其上的 json 属性。

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

在此先感谢您的帮助:)

如果编辑器在抱怨,而代码执行时不是错误,很可能是打字问题。您可以将 rename() 的 return 类型设置为:

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

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

或者您可以在 subscribe() 中键入 rep 数组作为 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); }
);

如果不同端点的结果结构一致,最好创建一个 interface/class 来替换 any[] 为。

希望对您有所帮助!

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())
  }
)