代码之家  ›  专栏  ›  技术社区  ›  porton

JavaScript中的异步函数很奇怪

  •  -1
  • porton  · 技术社区  · 4 年前
    $ cat x.js
    async function print() {
        console.log("abc");
    }
    
    print();
    $ nodejs x.js
    abc
    

    print() 返回一个 Promise 没有等待的对象,是吗?如果没有等待,那么为什么 console.log

    0 回复  |  直到 4 年前
        1
  •  0
  •   choz    4 年前

    可以说一个空函数本身返回 undefined

    function print() {}
    var returnVal = print(); // undefined
    

    你会注意到的 returnVal 未定义 .

    body 属于 test() 返回值 未定义

    function print() {
        console.log('abc');
    }
    var returnVal = print(); // undefined
    

    所以,为了让函数有一个返回值,我们只需要 return 是的。

    function print() {
        console.log('abc');
        return 1;
    }
    var returnVal = print(); // 1
    

    当你把它转换成异步函数时。引用自 MDN

    1. 异步函数的主体可以被认为是被零分割的 或更多等待表达。顶级代码,包括 第一个等待表达式(如果有)是同步运行的。在 这样,没有等待表达式的异步函数将运行 同步地。如果函数中有等待表达式 身体,

    2. 。然后回拨。 通过这种方式,承诺链是渐进的 . 回归 价值构成了链条的最后一环。

    现在,根据以上信息,以下是我们所知道的关于你的问题;

    1. 你的 print() 未定义
    2. 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`
    

    为了回答你的问题

    如果没有等待,那么为什么控制台.log执行?

    执行! - Awaits just to ensure the line execution is halted until the Asynchronous function (Promise) has reached fulfilled or rejected 悬而未决的 .

        2
  •  2
  •   Eason Yu    4 年前

    是的,就像choz说的,异步函数返回一个承诺,即使您在代码中没有定义承诺。

    我认为在等待声明中的所有承诺都得到解决之后,这个返回的承诺就实现了。

    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)
        })
    }