为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

宝慕林4294392 2024-01-18 10:11:35
$ cat x.jsasync function print() {    console.log("abc");}print();$ nodejs x.jsabc怎么会这样?!print()返回一个Promise未等待的对象,是吗?如果没有等待,那为什么会被console.log执行呢?
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

异步函数会返回一个 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)

    })

}


查看完整回答
反对 回复 2024-01-18
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

您可以说一个空函数本身返回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

当您将其转换为异步函数时。

  1. 异步函数的主体可以被认为是被零个或多个等待表达式分割。顶级代码,直到并包括第一个等待表达式(如果有),都是同步运行的。这样,没有await表达式的异步函数将同步运行。但是,如果函数体内有await 表达式,则异步函数将始终异步完成。

  2. 每个await 表达式之后的代码可以被认为存在于.then 回调中。通过这种方式,通过函数的每个可重入步骤逐步构建承诺链。返回值构成了链中的最后一个环节。

现在,根据上述信息,以下是我们所知道的与您的问题相关的信息;

  1. print()没有返回任何东西,这应该是undefined

  2. async 函数将异步完成,这意味着它将始终返回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


查看完整回答
反对 回复 2024-01-18
  • 2 回答
  • 0 关注
  • 49 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信