同步获取已解决的Promise的价值

时间:2018-11-22 14:16:36

标签: javascript ecmascript-6 promise es6-promise

如果我们知道某个Promise绝对可以解决,那么我们如何访问该值,如果不能,为什么不呢?

let a = Promise.resolve(123);

console.log(a.value); // ???

以下内容无效-打印“ First,Last,123”

console.log("First");
Promise.resolve(123).then(console.log);
console.log("Last");

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

4 个答案:

答案 0 :(得分:2)

否,无法执行此操作。这是设计使然。

Promise A +规范旨在用作一种简单,一致的方式来处理异步操作。限制之一是,在已解决的Promise上将新的回调传递到then()上,将始终在事件循环中的以后一个滴答声中执行,始终保持一致。

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

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

人们很难理解承诺和异步操作。我每天在这里看到有关承诺而不是“兑现”的问题。如果将访问承诺结果的非异步方式添加到默认承诺中,我会认为这会更大。尝试执行“正确的做事方式”是很好的。

但是,此决定并非简单地为您做出。您没有被困在那里。您可以很容易地构建自己的具有此功能的诺言版本,并且仍然可以与现有诺言一起使用。只要您的对象具有{promise / A +}行为的then()函数,您就可以随心所欲地处理其余对象。

答案 1 :(得分:1)

您可以使用async/await中的ES7语法

(async () => {
  console.log("First");
  console.log(await Promise.resolve(123));
  console.log("Last");
})()

请记住,await仅在async函数内部起作用

说明“为什么无法同步获取已解决的Promise的价值”

Promise debugging

  

通过设计,承诺的即时状态和价值不能为   从代码同步检查,而无需调用then()方法。

     

仅在检查promise对象时才能帮助调试   手动,您可以将更多信息作为特殊属性   无法从代码访问(目前由   缺少属性,将属性名称随机化   语言或调试器支持。

答案 2 :(得分:0)

Promise.resolve(123).then(function(value) {
    console.log(value);
}

看看this

答案 3 :(得分:0)

在JS中,承诺始终是异步的。

如果您确信诺言将要解决,则可以使用.then方法进行访问。

a.then(function(value) {
    console.log("First");
    console.log(value);
    console.log("Last");
    // expected output: 123
});

变量a如果是console.log,则如下所示

Promise {<resolved>: 123}
    __proto__: Promise
    [[PromiseStatus]]: "resolved"
    [[PromiseValue]]: 123

对于错误处理,您可以按照MDN docs中所述进行错误阻止。