【发布时间】:2021-12-18 04:42:59
【问题描述】:
我有一些使用 javascript async/await 的代码:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fun1()
{
console.log("dosomething1");
await sleep(6000);
console.log("dosomething2");
return "returnfromfun1";
}
console.log(fun1());
console.log("hello");
根据official document关于async/await:
一个异步函数可以包含一个等待表达式来暂停 执行异步函数并等待传递的 Promise 解决,然后恢复异步函数的执行和 返回解析后的值。
我希望得到以下输出:
dosomething1
//wait for 6 seconds
dosomething2
Promise { <state>: "fulfilled", <value>: "returnfromfun1" }
hello
但实际输出是:
dosomething1
Promise { <state>: "pending" }
hello
//wait for 6 seconds
dosomething2
似乎 fun1 在“等待”行返回。是我误解了官方文档中的描述吗?看来我从来没有得到 fun1("returnfromfun1") 的返回值。
【问题讨论】:
-
fun1是异步的,因此只需使用console.log(fun1());调用它就不会等待它解决 - 无论是await它还是调用.then它 -
“根据官方文档”——这是一个任何人都可以编辑的 wiki,而不是官方文档。官方文档在这里:ecma-international.org/ecma-262/9.0/…
-
异步函数返回承诺。调用该函数会立即同步地返回未解决的承诺。可以在
.then()中检索承诺的结果,例如fun1.then((result) => {})或通过等待它,例如var result = await fun1()。 -
啊哈,那个文件太官方了,看一眼就头疼:)
-
@JonasWilms 这么想,这几乎是一回事 -
var result = foo();(在另一个问题中)不等待异步操作完成,就像这里的console.log(fun1());不等待异步动作完成,虽然我猜还有stackoverflow.com/questions/23667086/…
标签: javascript asynchronous async-await