如果我们知道某个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
的值,如果不可能,为什么不呢?
答案 0 :(得分:2)
否,无法执行此操作。这是设计使然。
Promise A +规范旨在用作一种简单,一致的方式来处理异步操作。限制之一是,在已解决的Promise上将新的回调传递到then()
上,将始终在事件循环中的以后一个滴答声中执行,始终保持一致。
添加第二种方法来检查承诺结果并非不可能。这样做可能很容易,但是将其添加到规范中至少存在两个问题:
then()
函数。人们很难理解承诺和异步操作。我每天在这里看到有关承诺而不是“兑现”的问题。如果将访问承诺结果的非异步方式添加到默认承诺中,我会认为这会更大。尝试执行“正确的做事方式”是很好的。
但是,此决定并非简单地为您做出。您没有被困在那里。您可以很容易地构建自己的具有此功能的诺言版本,并且仍然可以与现有诺言一起使用。只要您的对象具有{promise / A +}行为的then()
函数,您就可以随心所欲地处理其余对象。
答案 1 :(得分:1)
您可以使用async/await
中的ES7
语法
(async () => {
console.log("First");
console.log(await Promise.resolve(123));
console.log("Last");
})()
请记住,await
仅在async
函数内部起作用
说明“为什么无法同步获取已解决的Promise的价值”
通过设计,承诺的即时状态和价值不能为 从代码同步检查,而无需调用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中所述进行错误阻止。