我遇到HTTP GET请求的问题..代码没有同步运行..下面是我的示例代码:
this.jilidService.getDBList().subscribe(
data => {
for (let i = 0; i < data.length; i++) {
this.data = data;
this.db_name[i] = this.data[i]
this.dbname = this.db_name[i]
console.log("1")
}
},
);
this.jilidService.getFileList(this.dbname).subscribe(
data1 => {
for (let i = 0; i < data1.length; i++) {
this.data = data1;
this.filename = data1[i]
console.log("2")
}
},
);
当我运行代码时,我从控制台日志中获得的结果是:
2
1
我想要的结果是:
1
2
答案 0 :(得分:3)
是的,这是正确的。 HTTP调用是异步的本质。这就是他们的工作方式。您发出HTTP 请求,并在将来某个时间点收到HTTP 响应。 HTTP一直都是这样。
传递给subscribe的方法基本上是一个回调函数,在收到响应时会回调。
解决问题的一种方法是将第二个调用放在第一个调用的回调函数中。像这样:
this.jilidService.getDBList().subscribe(
data => {
for (let i = 0; i < data.length; i++) {
this.data = data;
this.db_name[i] = this.data[i]
this.dbname = this.db_name[i]
console.log("1")
}
this.jilidService.getFileList(this.dbname).subscribe(
data1 => {
for (let i = 0; i < data1.length; i++) {
this.data = data1;
this.filename = data1[i]
console.log("2")
}
},
);
},
);
另一个选择是按照Rahul的建议使用switchMap。你可以在这里找到一个例子:
How to wait for first Observable to finish before executing others in parallel using RxJS