我有这个循环,每次循环都会发出HTTP发布请求。
for(let i = 1; i < this.data.length; i++) {
let arr = this.data[i];
this.http.post('link here', {
name: arr[0],
gender: arr[1],
course: arr[2],
year: arr[3]
}).subscribe(
(data: any) => console.log("succes at " + i),
error => console.log(error + "at" + arr[0])
);
}
但是我发现它不等待HTTP帖子完成才继续前进到下一个循环并执行下一个HTTP帖子。我要实现的是先完成一个HTTP帖子,然后再继续执行下一个执行HTTP帖子的循环。我不会实现这一点,因为我希望保存在数据库中的数据顺序与循环中数组的顺序相同。有什么想法怎么做?我正在使用uguglar和nodejs btw
答案 0 :(得分:2)
您可以像这样创建递归函数
IFERROR
要开始循环,请使用以下命令调用它:
example(i, limit, data) {
let arr = this.data[i];
this.http.post('link here', {
name: arr[0],
gender: arr[1],
course: arr[2],
year: arr[3]
}).subscribe(
(data: any) => console.log("succes at " + i),
error => console.log(error + "at" + arr[0]),
() => ++i < limit ? this.example(i, limit) : null
);
}
这样,this.example(0, this.data.length, this.data)
的下一次迭代直到上一次订阅完成后才被调用
答案 1 :(得分:0)
您可以使用aync/await
。
默认情况下,在成角度的http.get/post/etc
中返回Observable<T>
,但有一个toPromise()
方法使其成为Promise。获得承诺后,您可以使用async/await
我要添加一个POC,不知道它是否可以工作。我将针对语法错误进行编辑。
async function getAsyncData() {
for (let i = 1; i < this.data.length; i++) {
let arr = this.data[i];
const data = await this.http.post('link here', {
name: arr[0],
gender: arr[1],
course: arr[2],
year: arr[3]
})
.toPromise();
console.log(data);
}
}