首页 > 解决方案 > .then 方法中链接承诺与值之间的区别?

问题描述

有一段时间,我认为链接.then()语句的唯一方法是从 .then 方法返回一个承诺。例如:

    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");
      })

两者在执行方式和时间方面有区别吗?

标签: javascript

解决方案


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

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

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

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


推荐阅读