同步获取已解决 Promise 的值

Lol*_*ums 6 javascript promise ecmascript-6 es6-promise

如果我们知道 aPromise肯定已解析,那么我们如何访问该值,如果不能,为什么不呢?

let a = Promise.resolve(123);

console.log(a.value); // ???
Run Code Online (Sandbox Code Playgroud)

以下不起作用 - 它打印“First, Last, 123”

console.log("First");
Promise.resolve(123).then(console.log);
console.log("Last");
Run Code Online (Sandbox Code Playgroud)

我问如何同步获取已解决的值Promise,如果不可能,为什么不呢?

Eve*_*ert 5

不,这是不可能的。这是设计使然。

Promise A+ 规范旨在作为一种简单、一致的方式来处理异步操作。限制之一是,将新的回调传递给then()已解决的 Promise 将始终在事件循环中稍后的时间点上执行,因此事情是一致的。

添加第二种方法来检查承诺结果并非不可能。这样做可能很容易,但是将其添加到规范中至少存在两个问题:

  1. 如果您希望构建规范,您希望它尽可能简单。规范本身实际上只定义了then()功能。
  2. 通过添加此功能,您将为成群的开发人员打开大门,让他们对本已难以理解的东西更加困惑。

Promise 和异步操作对于人们来说很难理解。我每天都会在这里看到关于承诺而不是“得到”它的问题。如果将访问承诺结果的非异步方式添加到默认承诺中,我想这将是一个更大的数量。尝试并强制执行“正确的方式”做事是件好事。

然而,这个决定并不是简单地为你做出的。你并没有被困在那里。您可以非常轻松地构建自己的具有此功能的 Promise 版本,并且仍然可以与现有 Promise 一起使用。只要您的对象具有then()根据 Promises/A+ 运行的函数,您就可以对对象的其余部分执行任何您想要的操作。