无法处理 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())
}
)
我正在使用 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())
}
)