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


当前回答

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

Deno - Deno已经内置了它。

其他回答

现在可以在Node v13.3.0中使用顶级await

import axios from "axios";

const { data } = await axios.get("https://api.namefake.com/");
console.log(data);

使用——harmony-top-level-await标志运行它

节点——harmony-top-level-await index.js

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

Deno - Deno已经内置了它。

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

对于浏览器,你需要添加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(用户) > < /脚本

如果您的唯一目标是为了测试目的控制混合了其他代码的异步代码的执行顺序,那么您可以将整个顶级代码包装在定义为异步函数的立即调用函数表达式(IIFE)中。在问题的示例中,在调用main()之前添加await。

当您的代码不在异步函数中或不在模块的顶层主体中时,可以使用此模式。换句话说,如果你只是在一个js文件中测试一堆代码,并使用Live Server、RunJs或任何其他类型的JavaScript工具来观察控制台窗口,将所有代码包装在定义为异步的IIFE中,当你想在执行下一行之前等待异步代码完成时,使用await关键字。

let topLevelIIFE = (async () => { 异步函数main() { var value = await承诺。解决('嘿'); Console.log ('inside: ' + value); 返回值; } Var文本=等待main(); Console.log ('outside: ' + text); }) ()

在Chrome DevTools或其他行为类似的浏览器REPL工具的REPL中运行IIFE主体中指定的代码时,您不需要使用此模式。