来自教程:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
function resolveAfter2Seconds(x) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function f1() {
const x = await resolveAfter2Seconds(10);
console.log(x); // 10
}
f1();
我可以看到10
一直进入resolve(x)
,但它似乎没有从resolve
函数中出去。文档说Promise.resolve
返回另一个Promise
,但我没有看到任何代码将这个新的Promise
。我也没有看到任何代码将x
返回到外部作用域。文档似乎没有解释这一点,或者我只是不明白await
关键字如何知道返回值是10
?
2条答案
按热度按时间s2j5cfk01#
因为
resolve
将promise的resolved值设置为您传递给它的值,并且await
等待直到promise被resolved(或rejected)并返回resolved值(或抛出,如果promise被拒绝)。Promise.resolve
是一个不同的野兽-它返回一个已经解决的promise。因为你传递了一个你自己设计的新函数给
new Promise
,你可以把它命名为resolve
,例如ok
,如果这样更清楚的话:new Promise((ok) => ok(8))
(但请不要;约定是resolve
)。你不需要知道JavaScript引擎内部到底发生了什么,promise就可以工作。
rjzwgtxy2#
文件上写着承诺,解决
不要混淆
Promise
类的静态resolve
方法和作为第一个参数传递给new Promise
构造函数的函数。我也没有看到任何代码将x返回到外部作用域
因为
x
没有返回。你不能从一个异步操作中返回,这就是Promise存在的原因。
resolveAfter2Seconds
返回promise。这个promise的值为
x
。await
将f1
发送到休眠状态,直到其RHS上的promise解决。当它这样做时,它成为分配给另一个
x
的解析值。