我正在使用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()吗?我错过了什么吗?
提前感谢您的帮助:)
答案 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())
}
)