我已经阅读了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() ?


当前回答

在NodeJS 14.8+中,你可以使用顶级的await模块(#3解决方案)。你也可以将.js重命名为.mjs (ES模块)而不是.js(。cj CommonJS)。

其他回答

在NodeJS 14.8+中,你可以使用顶级的await模块(#3解决方案)。你也可以将.js重命名为.mjs (ES模块)而不是.js(。cj CommonJS)。

现在使用ECMAScript22,我们可以在顶级模块中使用await。

这是一个使用(await顶层)的例子:

const response = await fetch("...");
console.log(response):

另一个没有(await顶层)的示例

  async function callApi() {
    const response = await fetch("...");
    console.log(response)      
}
callApi()

节点, 你可以在REPL中运行node——experimental-repl-await。我不太确定脚本。

Deno - Deno已经内置了它。

对于浏览器,你需要添加type="module"

没有类型=“模块”

< >脚本 Const response = await fetch('https://jsonplaceholder.typicode.com/users'); Const users = await sp.json(); console.log(用户) > < /脚本

类型=“模块”

<!——script type="module" src=" wait.js"——> .js . <脚本类型=“模块”> Const response = await fetch('https://jsonplaceholder.typicode.com/users'); Const users = await sp.json(); console.log(用户) > < /脚本

顶级等待已经转移到阶段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