猿问

JavaScript 中异步函数的一个奇怪的事情

$ cat x.js

async function print() {

    console.log("abc");

}


print();

$ nodejs x.js

abc

怎么会这样?!print()返回一个Promise未等待的对象,是吗?如果没有等待,那为什么会被console.log执行呢?


宝慕林4294392
浏览 98回答 2
2回答

猛跑小猪

异步函数会返回一个 Promise,即使您没有在代码中定义 Promise。我认为在等待语句中的所有承诺都得到解决后,这个返回的承诺就得到了履行。我在下面的代码中测试它,它还返回 Promise,只有在所有 Promise 解决后(在本例中为 3000 毫秒后)才会实现:async function print2() {   await console.log("abc")    await new Promise((res, rej) => {        setTimeout(() => {res(33)},3000)    })    await new Promise((res, rej) => {        setTimeout(() => {res(33)},50)    })}

蝴蝶不菲

您可以说一个空函数本身返回undefined(实际上不返回任何内容)。看看下面的示例;function print() {}var returnVal = print(); // undefined你会注意到那returnVal是undefined.现在,如果我们有一些东西在body那里test(),但你仍然没有传递任何返回值,那么returnVal仍然会是undefined。function print() {    console.log('abc');}var returnVal = print(); // undefined因此,为了让函数有返回值,我们只需要return它即可。function print() {    console.log('abc');    return 1;}var returnVal = print(); // 1当您将其转换为异步函数时。异步函数的主体可以被认为是被零个或多个等待表达式分割。顶级代码,直到并包括第一个等待表达式(如果有),都是同步运行的。这样,没有await表达式的异步函数将同步运行。但是,如果函数体内有await 表达式,则异步函数将始终异步完成。每个await 表达式之后的代码可以被认为存在于.then 回调中。通过这种方式,通过函数的每个可重入步骤逐步构建承诺链。返回值构成了链中的最后一个环节。现在,根据上述信息,以下是我们所知道的与您的问题相关的信息;你print()没有返回任何东西,这应该是undefinedasync 函数将异步完成,这意味着它将始终返回Promise。待定、已履行或已拒绝所以,在你的问题中说一下,这就是你的函数实际上所做的事情;async function print() {    console.log("abc"); // Prints 'abc'}// Function above is equivalent to;function printEquivalentInNonAsync() {    console.log("abc"); // Prints 'abc'}var returnVal = print(); // `returnVal` is `undefined`并且,回答你的问题如果没有等待,那么为什么会执行console.log?无论等待异步函数,它仍然会执行!-等待只是为了确保停止行执行,直到异步函数(Promise)达到已完成或已拒绝。请注意,Promise 的第一个状态是pending。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答