Javascript 同步获取已解析承诺的值

Javascript 同步获取已解析承诺的值,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,如果我们知道一个承诺已经得到了明确的解决,那么我们如何获取该值?如果我们不能,为什么不能 let a = Promise.resolve(123); console.log(a.value); // ??? 以下操作不起作用-它打印“First,Last,123” 我在问如何同步获取已解析的承诺的值,如果不可能,为什么不呢? Promise.resolve(123).then(function(value) { console.log(value); } 看看承诺在JS中总是异步的

如果我们知道一个承诺已经得到了明确的解决,那么我们如何获取该值?如果我们不能,为什么不能

let a = Promise.resolve(123);

console.log(a.value); // ???
以下操作不起作用-它打印“First,Last,123”

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

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

看看

承诺在JS中总是异步的

如果您确信promise将得到解决,那么您可以使用
方法访问它

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
Promise{:123}
__承诺
[[PromiseStatus]]:“已解决”
[[PromiseValue]]:123

对于错误处理,您可以按照MDN中提到的错误块。

否,这是不可能的。这是故意的

Promise A+规范旨在用作处理异步操作的简单、一致的方法。其中一个限制是,将一个新的回调传递给一个已经解析的promise上的
then()
,它总是在事件循环中稍后的一个勾号上执行,因此事情是一致的

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

  • 如果您希望构建一个规范,那么您希望它尽可能简单。规范本身实际上只定义了
    then()
    函数
  • 通过添加此功能,您将为成群结队的开发人员打开大门,他们对一些已经很难摸索的东西感到更加困惑
  • 承诺和异步操作很难让人理解。我每天都在这里看到关于承诺和不“得到”承诺的问题。如果将访问承诺结果的非异步方式添加到默认承诺中,我想这将是一个更大的数目。尝试和执行“正确的方式”做事情是很好的


    然而,这个决定并不仅仅是为你做出的。你没有被困在那里。您可以非常轻松地构建具有此功能的承诺的自己版本,并且仍然可以使用现有承诺。只要你的对象有一个
    then()
    函数,它的行为符合承诺/a+,你就可以随心所欲地处理对象的其余部分。

    promise。然后((result)=>{})使用这个
    promise.resolve(123)。然后(console.log)
    @hassaniam不同步-我已经更新了我的答案谢谢,但也不同步,因为前面提到的
    承诺
    在JS中是异步的。您无法更改js的行为以使其同步。关于为什么在mdn文档中提到它。谢谢,但这也不是同步的是,因为方法返回的值是一个承诺(正如mdn文档所说)。承诺本身是异步的,这意味着您无法同步获取值。
    Promise {<resolved>: 123}
        __proto__: Promise
        [[PromiseStatus]]: "resolved"
        [[PromiseValue]]: 123