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

异步函数承诺何时解析?

  •  0
  • zhangjinzhou  · 技术社区  · 6 年前

    我有以下代码:

    let func = () => {
        return new Promise((resolve) => {
            setTimeout(() => {
                console.log("two");
                resolve();
            }, 3000);
        })
    };
    
    let func2 = async () => {
        console.log("one");
        await func();
        console.log("three");
    }
    
    (async () => {
        await func2();
        console.log("main"); // This should never be executed
    })()
    

    注意到 func2 永不回报价值,承诺回报 功能2 在我看来永远都不应该被填满。因此 console.log("main") 不应该被处决。但是它是在 console.log("three") .有人能给我解释一下吗?

    4 回复  |  直到 6 年前
        1
  •  2
  •   jfriend00    6 年前

    注意到func2从来没有返回值,我认为func2返回的承诺永远不应该是完全的。

    这不是异步函数的工作方式。func2在完成执行时返回。不带no的函数的返回值 return 语句是特定值 undefined 是的。所以, 未定义 成为承诺的确定价值。记住,在javascript中, 未定义 是一个特定值。好像是你干的 return undefined 在功能块的末尾。所以,自从 未定义 是返回值,它成为 async 答应我。


    完全覆盖所有基地, 异步的 函数总是返回一个promise,该promise通过以下方式之一得到一个解析/拒绝的值:

    一。当你明确地 返回 函数的值。 这就成了 异步 函数返回。

    async function test() {
        return "hello";
    }
    
    test().then(val => {
        console.log(val);      // "hello"
    });
    

    2.当你抛出异常时。 例外成为承诺的拒绝理由 异步 函数返回。

    async function test() {
        throw new Error("ouch");
    }
    
    test().catch(err => {
        console.log(err);      // Shows error object with message "ouch"
    });
    

    三。当你还另一个承诺。 这个承诺被链接到异步函数返回的承诺,异步函数返回的承诺将跟随您返回的承诺(当它使用相同的值解析或使用相同的原因拒绝时进行解析)。

    async function test() {
        return new Promise(resolve => {
            setTimeout(() => {
                resolve("hi");
            }, 1000);
        });
    }
    
    test().then(val => {
        console.log(val);      // "hi"
    });
    

    四。当你什么都不回的时候。 这与正则函数中的相同,相当于 返回未定义 在功能块的末尾,因此解析值采用 未定义 是的。

    所以,这个:

    async function test() {
        console.log("hi");
    }
    
    test().then(val => {
        console.log(val);      // undefined
    });
    

    工作原理与此完全相同:

    async function test() {
        console.log("hi");
        return undefined;
    }
    
    test().then(val => {
        console.log(val);      // undefined
    });
    
        2
  •  1
  •   Jonas Wilms    6 年前

    一个不解释地返回某物的函数,实际上返回 undefined 以下内容:

    function test() { }
    console.log(test());
    

    这与异步函数相同,它们还解析为 未定义 当没有返回其他值时。

        3
  •  1
  •   Alan Friedman    6 年前

    一个 async 函数不需要返回值来解析。当它在没有错误的情况下完成执行时,它被视为已解决。

    如果你 throw new Error() 内部 func2 我是说, console.log("main") 永远不会被处决。

        4
  •  1
  •   Mark    6 年前

    如果不从函数返回,则隐式返回通常未定义的默认值。所以承诺的回报 func2 函数返回时仍将解析。

    MDN 以下内容:

    没有返回语句的函数将返回默认值。在 使用new关键字调用构造函数的情况,默认值为 值是其此参数的值。对于所有其他功能, 默认返回值未定义。

    如果将其更改为以下内容,则可以在代码中看到:

    (async () => {
        func2()
        .then(d => console.log(d));
    })()