Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 订阅中的角度订阅循环_Angular_Typescript_Http_Ionic Framework_Subscribe - Fatal编程技术网

Angular 订阅中的角度订阅循环

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

我希望检索每个城市的文档

我有一个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.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)
);