代码之家  ›  专栏  ›  技术社区  ›  esseara

角度4-答应。全部不起作用

  •  0
  • esseara  · 技术社区  · 6 年前

    Promise.all(...) 在使用服务器上需要的数据之前,等待一些REST调用结束。代码结构如下:

    const promise1 = this.myService.myFirstRestFunction(a.id).toPromise().then(s => variable1 = s;);
    
    const promise2 = this.myService.mySecondRestFunction(b.id).then(r => {
      this.myService.myThirdRestFunciont(r.id).then(c => variable2 = c);
    });
    
    Promise.all([promise1, promise2]).then(p => {
      this.myService.getData(variable1.id, variable2.id)
        .subscribe(...);
    });
    

    但是 variable2 id 字段。这和 myThirdRestFunction() 那叫里面?如果是这样,我如何管理这样的后续REST调用并等待获取大部分内部数据?谢谢。

    编辑 :我按照@Suren Srapyan和@Sachila Ranawaka的答案更改了代码。

    const promise1 = this.myService.myFirstRestFunction(a.id).toPromise();
    
    const promise2 = this.myService.mySecondRestFunction(b.id).then(r => {
      this.myService.myThirdRestFunciont(r.id);
    });
    
    Promise.all([promise1, promise2]).then(p => {
      this.myService.getData(p[0].id, p[1].id)
        .subscribe(...);
    });
    

    在这种情况下,我明白了 p[0] 但是 p[1]

    const promise2 = this.myService.mySecondRestFunction(b.id).then(r => {
          this.myService.myThirdRestFunciont(r.id).then(c => console.log(c));
        });
    

    对象 c 正确记录,所以 不应该是未定义的。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Suren Srapyan    6 年前

    你不需要给变量赋值。 Promise.all 将解决所有的承诺,如果可能的话,并将结果传递到 p

    只需从 then 功能和访问通过 p[0] p[1] Promise.all(...).then(p => ...)

    const promise1 = this.myService.myFirstRestFunction(a.id).toPromise()
    
    const promise2 = this.myService.mySecondRestFunction(b.id)
                                   .then(r => this.myService.myThirdRestFuncion(r.id));
    
    Promise.all([promise1, promise2]).then(p => {
      this.myService.getData(p[0].id, p[1].id).subscribe(...);
    });
    

    我不知道你的承诺回报了什么,所以我提供 p[0].id . 根据你的结果改变这个。

    Promise.all([promise1, promise2]).then(([var1, var2]) => {
        this.myService.getData(var1.id, var2.id).subscribe(...);
    });
    
        2
  •  0
  •   Sachila Ranawaka    6 年前

    不要解决前两个承诺。 Promise.all 会帮你解决所有的承诺

    const promise1 = this.myService.myFirstRestFunction(a.id).toPromise() 
    const promise2 = this.myService.mySecondRestFunction(b.id) 
    
    Promise.all([promise1, promise2]).then(p => {
      this.myService.getData(variable1.id, variable2.id)
        .subscribe(...);
    });