Angular 订阅中的角度订阅循环
我希望检索每个城市的文档 我有一个http GET通过解析页面来检索城市,然后我需要为每个城市发出另一个请求来检索相关文档 我所做的Angular 订阅中的角度订阅循环,angular,typescript,http,ionic-framework,subscribe,Angular,Typescript,Http,Ionic Framework,Subscribe,我希望检索每个城市的文档 我有一个http GET通过解析页面来检索城市,然后我需要为每个城市发出另一个请求来检索相关文档 我所做的 this.httpService.callUrl(ifrUrl).subscribe((html:string)=>{ constroot=parse(html); const nodes=root.queryselectoral(IFR\u选择器); 康斯特机场=[]; for(const node of nodes){//每个城市的循环 if(node.chi
this.httpService.callUrl(ifrUrl).subscribe((html:string)=>{
constroot=parse(html);
const nodes=root.queryselectoral(IFR\u选择器);
康斯特机场=[];
for(const node of nodes){//每个城市的循环
if(node.childNodes.length==2){
const linkElement=node.childNodes[1];
//@ts忽略
const link=linkElement.attributes.href;
const airportUrl=this.urlService.getIfrUrlWithEnd(链接);
const airportName=linkElement.innerText.trim().replace('\n','');
//@ts忽略
const icaoSplit=linkElement.attributes.id.toString().split('.');
const icao=icaoSplit[icaoSplit.length-1];
//检索与实际机场关联的文档
//使用另一个http请求
this.getifrchartsforrl(airportUrl).subscribe((图表)=>{
const airport=新的IfrAirport();
airport.icao=国际民航组织;
airport.name=airportName;
airport.url=airportUrl;
airport.charts=图表;
});
}
}
控制台日志(“机场”);
控制台日志(机场);
我不太熟悉异步函数。在这里,我尝试在之后显示airport,但在使用空airport数组运行脚本后,日志将直接显示
应返回阵列生成机场
我错过了什么
N K S您可以使用RxJS高阶映射操作符(如
switchMap
映射可观察对象)和forkJoin
函数来组合多个可观察对象,而不是在循环中嵌套订阅和订阅
试试下面的方法
this.httpService.callUrl(ifrUrl).pipe(
switchMap((html:string)=>{
constroot=parse(html);
const nodes=root.queryselectoral(IFR\u选择器);
常量请求=[];
for(const node of nodes){//每个城市的循环
if(node.childNodes.length==2){
const linkElement=node.childNodes[1];
//@ts忽略
const link=linkElement.attributes.href;
const airportUrl=this.urlService.getIfrUrlWithEnd(链接);
const airportName=linkElement.innerText.trim().replace('\n','');
//@ts忽略
const icaoSplit=linkElement.attributes.id.toString().split('.');
const icao=icaoSplit[icaoSplit.length-1];
请求推送(
这个.getifrchartsforrl(airportUrl).pipe(
地图(图表=>{
const airport=新的IfrAirport();
airport.icao=国际民航组织;
airport.name=airportName;
airport.url=airportUrl;
airport.charts=图表;
返回机场;
})
)
);
}
}
返回forkJoin(请求);
})
).订阅(
airports=>console.log(机场),
err=>console.log(err)
);
您可以使用RxJS高阶映射操作符(如switchMap
映射一个可观察对象)和forkJoin
函数来组合多个可观察对象,而不是在循环中嵌套订阅和订阅
试试下面的方法
this.httpService.callUrl(ifrUrl).pipe(
switchMap((html:string)=>{
constroot=parse(html);
const nodes=root.queryselectoral(IFR\u选择器);
常量请求=[];
for(const node of nodes){//每个城市的循环
if(node.childNodes.length==2){
const linkElement=node.childNodes[1];
//@ts忽略
const link=linkElement.attributes.href;
const airportUrl=this.urlService.getIfrUrlWithEnd(链接);
const airportName=linkElement.innerText.trim().replace('\n','');
//@ts忽略
const icaoSplit=linkElement.attributes.id.toString().split('.');
const icao=icaoSplit[icaoSplit.length-1];
请求推送(
这个.getifrchartsforrl(airportUrl).pipe(
地图(图表=>{
const airport=新的IfrAirport();
airport.icao=国际民航组织;
airport.name=airportName;
airport.url=airportUrl;
airport.charts=图表;
返回机场;
})
)
);
}
}
返回forkJoin(请求);
})
).订阅(
airports=>console.log(机场),
err=>console.log(err)
);