.then方法中的链接承诺和值之间的区别?

时间:2020-10-16 15:45:46

标签: javascript

一段时间以来,我认为链接.then()语句的唯一方法是从.then方法返回一个promise。 e。 g。:

    asyncFunc()
       .then(res => asyncFunc2()) // returns a promise
       .then(res => doSmth())

但是现在我发现您实际上还可以从.then函数返回一个简单的旧值,它也可以工作:

    const build = () => new Promise((resolve, reject) => {
        setTimeout(() => {
        resolve("Hallo")
      }, 100)
    })
    
    build()
        .then(res => {
        console.log(res);
        return res + " I'm";
      })
      .then(res => {
        console.log(res + " Peter");
      })

两者的执行方式和执行时间是否有所不同?

1 个答案:

答案 0 :(得分:2)

每个.then()方法调用都返回一个诺言,如果回调函数的返回值也是一个诺言,则.then()方法调用返回的诺言将解析为该诺言,这意味着其命运现在将取决于回调函数返回的promise发生了什么。当回调函数返回的promise成立时,它将解决。

另一方面,如果您返回一个非承诺值,则该值将隐式包装在一个Promise中,并传递给下一个.then()方法调用(如果有)。如果您没有从回调函数返回任何内容,则.then()方法返回的promise将以undefined的值解析。

在第一个代码示例中,当您从第一个asyncFunc2()方法的回调函数返回.then()时,它返回的承诺将解析为asyncFunc2()返回的承诺。 / p>

在第二个代码示例中,res + " I'm"将隐式包装在一个promise中,然后传递给第二个then()方法。