[英]Async function returning before await is complete
我从以下示例中得到两个问题:
为什么x在y之前记录? 为什么xa承诺?
我期待bar
在它记录之前等待foo
以值'Hello'
解析然后返回它。
let foo = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello');
}, 2000);
})
}
let bar = async () => {
let y = await foo();
console.log(y);
return y;
}
let x = bar();
console.log(x);
我期待看到的是
'Hello' // console.log(y)
'Hello' // console.log(x)
我得到的是
Promise {<pending>} // console.log(x)
'Hello' // console.log(y)
应该不是bar
等foo
返回前解决y
?
任何帮助将非常感激!
以下是有关async function
的文档: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
和Promise
对象: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
声明async function
返回一个Promise
对象,该对象在解析pending
处于pending
状态。
现在让我们来看看你的代码:
您为x
分配了返回值bar()
,这是一个Promise
,因为没有await
关键字来停止执行(而且你不能添加一个,因为你在async function
)这个promise被记录为pending因为async function bar()
尚未返回。
同时,在async function bar()
,为y
分配async function foo()
的返回值,它也是一个Promise
,但这次你等待结果。 经过2秒的等待时间后,承诺得以实现,并使用resolve()
方法的参数记录y
,即Hello
。
因此,您见证的行为是预期的行为。
你需要await
这个功能:
let example = async () => {
let foo = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello');
}, 2000);
})
}
let bar = async () => {
let y = await foo();
console.log(y);
return y;
}
let x = await bar();
console.log(x);
}
example();
你应该在调用bar()
之前使用await
,但实际上,你可以使用await
就像你用async
函数包装它一样,如下所示:
async function Func() {
let foo = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello');
}, 2000);
})
}
let bar = async () => {
let y = await foo();
console.log(y);
return y;
}
let x = await bar();
console.log(x);
}
当你执行Func();
你的期望会激发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.