如何等待直到http.get完成角度

时间:2019-02-12 21:58:42

标签: angular typescript subscription

我一直在尝试向_________________________________________________ | Id | Car_Type_Id | Company_Id | _________________________________________________| | 5 | 1 | 1 | | 6 | 2 | 1 | | 3 | 3 | Null | | 4 | 4 | Null | |________________________________________________| 数组中添加值,但是我遇到了一个问题,即它比返回if(motherArgument[i] == childArgument[i]) 函数的值更早进入data。我一直在尝试修复它,但无法提出解决方案,在这里感觉有点迷茫。

这是我形成数据的功能:

data.push()

这是我的getValue函数的样子:

getValue

如何避免在该值实际存在之前将数据推入数组?

2 个答案:

答案 0 :(得分:1)

如果这是一个不太复杂的问题,我将完全支持重复该问题,但正如我对该问题的评论所言,这样做要复杂一些。

对于初学者,您绝对应该阅读异步功能以及如何使用它们的响应。下一步,通常应该避免在循环内使用异步函数,因为它们可能难以预测和控制。幸运的是,有一些方法可以使异步函数表现得更加同步。

观察以下内容:

async formData(): Promise<void> {
  for (const id of Object.keys(this.cols)) {
    let p= cols[id];
    switch (p.name) {
      case 'a':
      this.temp.name= this.addValue(m, p);
        break;
      case 'b':
        let idx = 1;
        let surname = await this.getValue(idx);
        break;
    }
  }
  this.data.push(this.temp);
});

getValue(id: string): Promise<string> {
    return new Promise(resolve => {
        let url = this.baseUrl + '/streams/' + id+ '/data?';
        url += 'from=' + from + '&';
        url += 'to=' + to;
        this.http.get(url).map(r => r.json()).subscribe((response: any) => {
            if (response.data.values[0] !== null && response.data.values[0] !== undefined) {
                resolve(response.data.values[0]);
            }
        }, (error: any) => {
            resolve(null);
        });
    });
}

您对getValue的调用是异步调用,因为在返回值之前需要延迟(对服务器的调用)。我将其包装在Promise中,因为您希望订阅的成功路径和错误路径都返回一个值。

如果我们用formData关键字标记async方法,我们现在可以在方法中使用await关键字。这将导致方法流在控制继续之前等待getValue承诺的返回。

不建议:通过用异步标记formData方法,即使您没有直接从该方法返回任何内容,它也使该方法的返回类型为Promise

答案 1 :(得分:0)

  

如何避免在该值实际存在之前将数据推入数组?

将其链接到订阅,例如

this.http.get(url).map(r => r.json()).subscribe((response: any) => {
        if (response.data.values[0] !== null && response.data.values[0] !== undefined) {
         // NOTE
         this.loadFormData();
        }