在循环中执行下一个HTTP发布之前,请先完成HTTP发布请求

时间:2018-08-04 19:15:39

标签: node.js angular

我有这个循环,每次循环都会发出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

2 个答案:

答案 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);
    }
}
相关问题