then() 方法中的 Promise.resolve 不传递其解析值

Yiz*_*zhe 1 es6-promise

我发现了一个关于 Promise 的有趣的事情。当我运行以下代码时,它给了我与 'bb' 相反的 'aa' 输出,这让我很困惑。有谁明白原因并解释一下吗?谢谢!

Promise.resolve('aa')
.then(Promise.resolve('bb'))
.then(console.log);
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 13

好吧,您正在滥用.then()处理程序,因此您没有得到所需的答案也就不足为奇了。

一个.then()处理程序应传递一个函数引用。您正在向它传递一个承诺,它会尽职尽责地忽略它,因为它不是一个可调用的函数。

当你这样做时:

.then(Promise.resolve('bb'))
Run Code Online (Sandbox Code Playgroud)

Promise.resolve('bb')立即执行并将返回结果(这是一个承诺)传递给.then(). 所以,.then()当你应该传递一个函数引用时,你传递了一个承诺。如果您将代码更改为此,那么您将得到您所期望的:

.then(Promise.resolve('bb'))
Run Code Online (Sandbox Code Playgroud)

请记住,将某些内容传递给的重点.then()是它可以在父承诺解决/拒绝时稍后执行。因此,为了使之成为可能,您必须传递一个函数引用,该函数引用可以在以后由 Promise 基础设施调用。

使用 ES6 语法,您可以缩短为:

Promise.resolve('aa')
  .then(_ => Promise.resolve('bb))
  .then(console.log);
Run Code Online (Sandbox Code Playgroud)