我已经阅读了async/await,在阅读了几篇文章之后,我决定自己测试一下。然而,我似乎不明白为什么这行不通:
async function main() {
var value = await Promise.resolve('Hey there');
console.log('inside: ' + value);
return value;
}
var text = main();
console.log('outside: ' + text);
控制台输出以下内容(节点v8.6.0):
> outside: [object Promise]
> inside:嘿,大家好
为什么函数内部的日志消息之后执行?我认为创建async/await的原因是为了使用异步任务执行同步执行。
是否有一种方法可以使用函数内部返回的值,而不使用main()后的.then() ?
顶级等待已经转移到阶段3阶段4(见namo的评论),所以你的问题的答案是我如何在顶级使用async/await ?就是使用await:
const text = await Promise.resolve('Hey there');
console.log('outside: ' + text)
如果你想要main()函数:在main()调用中添加await:
async function main() {
var value = await Promise.resolve('Hey there');
console.log('inside: ' + value);
return value;
}
var text = await main();
console.log('outside: ' + text)
兼容性
v8自2019年10月起
Chrome DevTools, Node.js和Safari web检查器中的REPL
标志后面的节点v13.3+——harmony-top-level-await
TypeScript 3.8+(发行)
Deno自2019年10月起
Webpack@v5.0.0-alpha.15
2021年的答案:你现在可以在当前稳定版本的节点中使用顶级等待
上面的大多数答案都有点过时或非常冗长,所以这里有一个关于节点14的快速示例。
创建一个名为runme.mjs的文件:
import * as util from "util";
import { exec as lameExec } from "child_process";
const exec = util.promisify(lameExec);
const log = console.log.bind(console);
// Top level await works now
const { stdout, stderr } = await exec("ls -la");
log("Output:\n", stdout);
log("\n\nErrors:\n", stderr);
运行node runme.mjs
Output:
total 20
drwxr-xr-x 2 mike mike 4096 Aug 12 12:05 .
drwxr-xr-x 30 mike mike 4096 Aug 12 11:05 ..
-rw-r--r-- 1 mike mike 130 Aug 12 12:01 file.json
-rw-r--r-- 1 mike mike 770 Aug 12 12:12 runme.mjs
Errors: