Node.js 在循环中执行下一个HTTP post之前,先完成HTTP post请求

Node.js 在循环中执行下一个HTTP post之前,先完成HTTP post请求,node.js,angular,Node.js,Angular,我有一个循环,它每次循环都会发出HTTP post请求 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

我有一个循环,它每次循环都会发出HTTP post请求

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])
      );
    }
for(设i=1;iconsole.log(“在“+i”成功),
error=>console.log(错误+”位于“+arr[0]”)
);
}

但我发现,它不会等到HTTP post完成后才进入下一个循环并执行下一个HTTP post。我想要实现的是在继续执行下一个循环执行HTTP post之前先完成一个HTTP post。我不会实现这一点,因为我希望数据库中保存的数据顺序与循环中数组的顺序相同。有什么办法吗?我使用anuglar和nodejs顺便说一句,你可以创建一个递归函数,如下所示

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
    );
}

这样,在上一次订阅完成之前,不会调用
示例的下一次迭代
,您可以使用
aync/await

在angular
http.get/post/etc
中,默认情况下返回一个
Observable
,但有一个
toPromise()
方法使其成为承诺。一旦得到承诺,您就可以使用
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);
    }
}
异步函数getAsyncData(){ for(设i=1;i并强烈考虑添加超时,这样就不会每秒请求500次服务器。
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);
    }
}