“async”关键字的含义是什么?

Jer*_*oen -1 javascript node.js async-await es6-promise

我一直在阅读 Node.js 中的 async/await。我了解到await关键字等待承诺得到解决,或者如果被拒绝则抛出异常。

我还了解到,每个想要使用的功能都await需要标记async。但是,函数被标记为 async 意味着什么

我能找到的所有资源和博客文章似乎都await非常详细地解释了,但忽略了函数的概念async,或者简单地掩盖了它。例如,笔者是这样表述的:

这使得函数隐式返回一个 Promise。

async关键字的真正作用是什么?函数隐式返回 Promise 意味着什么?除了可以使用之外还有什么副作用await


好吧,从我迄今为止收到的答案来看,很明显它只是将函数的返回值包装到 a 中Promise,就像那样Promise.then。但这留下了一个新问题。为什么使用的函数await需要async返回 a Promise

zer*_*298 5

无论你return的函数实际上是什么,你的async函数仍然会返回一个Promise. 如果您return输入数字,它实际上返回一个Promise解析为Number您最初返回的数字。这允许您编写同步“查看”代码。

而不必写出这样的内容:

function foo(){
    return Promise.resolve("foo");
}
Run Code Online (Sandbox Code Playgroud)

你可以这样写:

async function foo(){
    return "foo";
}
Run Code Online (Sandbox Code Playgroud)

foo()会自动返回Promise解析为 的a "foo"


回复您的评论:

它的行为是否像 Promise.then 一样,如果你已经返回了一个 Promise,它不会再次包装它?

await将剥离 Promise 直到它达到一个值:

async function foo() {
    return Promise.resolve(Promise.resolve(true));
}

async function bar() {
    return true;
}

(async function () {
    let tmp;
    tmp = await foo();
    console.log(tmp);
    tmp = await bar();
    console.log(tmp);
    console.log("Done");
}());

/*
Prints:

true
true
Done
*/
Run Code Online (Sandbox Code Playgroud)

为什么需要异步?

转述@KevinB 的评论

await,就像生成器中的yield一样,暂停该上下文的执行,直到Promise它正在等待的不再挂起。这在正常功能中不会发生。

如果函数是async但不包含await,则承诺将立即得到解决,并且任何回调都将在下一个tick 上运行。