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

如何连锁承诺

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

    在这个简化的示例中,当第一个承诺得到解决时,我将调用三个函数。

    var test = new Promise(function (res, err) { setTimeout(res, 3000) })
    
    test.then( () => { console.log("A") });
    test.then( () => { 
        return new Promise(function(res, err) { 
            setTimeout(()=> { console.log("C"); 
            res() }, 3000) 
        }); 
    });
    
    test.then( () => { console.log("B") });
    

    输出如预期 A B C .

    假设我想调用第三个 .then 安慰 B 只有当第二个承诺得到解决。

    如果我试图兑现第二个承诺( myProm )在全局中并附加 然后 函数,我会得到一个(合理的)类型错误,因为在编译时myprom仍然是未定义的。

    var test = new Promise(function (res, err) { setTimeout(res, 3000) })
    var myProm;
    
    test.then( () => { console.log("A") });
    test.then( () => { 
        myProm = new Promise(function(res, err) { 
            setTimeout(()=> { console.log("C"); 
            res() }, 3000) 
        })
        return myProm;
    });
    
    myProm.then( () => { console.log("B") });
    

    如何继续?把两个承诺连在一起的最好方法是什么?这样一来,从一个承诺中就可以得到回报。 然后 在执行下一个任务之前需要解决 then .

    在这个场景中,我想要的输出是 A C B

    2 回复  |  直到 6 年前
        1
  •  1
  •   CertainPerformance    6 年前

    每次你打电话 .then ,创建一个 新的 Promise 许诺 由那个返回 然后 解决。您应该分配 myProm 然后 到变量,然后调用 然后 在这个变量上:

    var test = new Promise(function (res, err) { setTimeout(res, 500) })
    var myProm;
    
    test.then( () => { console.log("A") })
      .then( () => { 
          myProm = new Promise(function(res, err) { 
              setTimeout(()=> { console.log("C"); 
              res() }, 500) 
          })
          return myProm;
      })
      .then( () => { console.log("B") });

    大部分时间 使用时 Promises 你应该用链子 然后 像这样。只做 prom.then(...) ... prom.then(...) 当您想初始化两个 完全分离 异步操作时 prom 解决。

        2
  •  2
  •   JLRishe    6 年前

    then 返回一个Promise,该Promise在所指示的函数运行且返回的值已解析时解析(这有点过于简单,但足以满足此处的任务)。

    因此,在一个 然后 . 再加一个 .then :

    var test = new Promise(function (res, err) { setTimeout(res, 3000) })
    
    test.then( () => { console.log("A") });
    test
        .then( () => { 
            return new Promise(function(res, err) { 
                setTimeout(()=> { console.log("C"); res() }, 3000);
            });
        })
        .then( () => { console.log("B") });