Javascript 异步函数承诺何时解决?

Javascript 异步函数承诺何时解决?,javascript,node.js,async-await,Javascript,Node.js,Async Await,我有以下代码: let func = () => { return new Promise((resolve) => { setTimeout(() => { console.log("two"); resolve(); }, 3000); }) }; let func2 = async () => { console.log("one"); await fu

我有以下代码:

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
从不返回值,在我看来,
func2
返回的承诺永远不应该实现。因此,永远不应该执行
console.log(“main”)
。但是,它是在
console.log(“三”)
之后执行的。有人能给我解释一下吗?

一个函数,它不显式地返回某些内容,实际上返回未定义的

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

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

一个不明确返回某个值的函数,实际上返回未定义的值:

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

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

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


如果在
func2
中抛出新错误(),
console.log(“main”)
将永远不会执行。

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


如果在
func2
中抛出新错误()
console.log(“main”)
将永远不会执行。

如果不从函数返回,它将隐式返回默认值-通常未定义。因此,当函数返回时,
func2
返回的承诺仍将得到解决

async function test() {
    return "hello";
}

test().then(val => {
    console.log(val);      // "hello"
});
async function test() {
    throw new Error("ouch");
}

test().catch(err => {
    console.log(err);      // Shows error object with message "ouch"
});
发件人:

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

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

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

如果不从函数返回,它将隐式返回默认值-通常未定义。因此,当函数返回时,
func2
返回的承诺仍将得到解决

async function test() {
    return "hello";
}

test().then(val => {
    console.log(val);      // "hello"
});
async function test() {
    throw new Error("ouch");
}

test().catch(err => {
    console.log(err);      // Shows error object with message "ouch"
});
发件人:

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

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

(async () => {
    func2()
    .then(d => console.log(d));
})()
注意func2从不返回值,在我看来,func2返回的承诺永远不应该被完全履行

异步函数不是这样工作的。func2执行完毕后返回。没有返回语句的函数的返回值是未定义的特定值。因此,
undefined
成为承诺的解析值。记住,在Javascript中,
undefined
是一个特定的值。这就好像您在函数块的末尾返回了未定义的
。因此,由于
undefined
是返回值,因此它成为
async
承诺的解析值


要完全覆盖所有基础,
async
函数始终返回一个承诺,并且该承诺通过以下方式之一获得已解析/拒绝的值:

1。当您显式地
返回函数中的值时。这将成为
异步
函数返回的承诺的解析值

async function test() {
    return "hello";
}

test().then(val => {
    console.log(val);      // "hello"
});
async function test() {
    throw new Error("ouch");
}

test().catch(err => {
    console.log(err);      // Shows error object with message "ouch"
});
2。当您抛出异常时。异常成为
async
函数返回的承诺的拒绝原因

async function test() {
    return "hello";
}

test().then(val => {
    console.log(val);      // "hello"
});
async function test() {
    throw new Error("ouch");
}

test().catch(err => {
    console.log(err);      // Shows error object with message "ouch"
});
3。当您返回另一个承诺时。该承诺将链接到异步函数返回的承诺,异步函数返回的承诺将跟随您返回的承诺(使用相同值解析时解析,或使用相同原因拒绝)

4。当您不返回任何内容时。这与常规函数中相同,相当于函数块末尾的
返回未定义的
,因此解析值取
未定义的值

那么这个,

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
});
注意func2从不返回值,在我看来,func2返回的承诺永远不应该被完全履行

异步函数不是这样工作的。func2执行完毕后返回。没有返回语句的函数的返回值是未定义的特定值。因此,
undefined
成为承诺的解析值。记住,在Javascript中,
undefined
是一个特定的值。这就好像您在函数块的末尾返回了未定义的
。因此,由于
undefined
是返回值,因此它成为
async
承诺的解析值


要完全覆盖所有基础,
async
函数始终返回一个承诺,并且该承诺通过以下方式之一获得已解析/拒绝的值:

1。当您显式地
返回函数中的值时。这将成为
异步
函数返回的承诺的解析值

async function test() {
    return "hello";
}

test().then(val => {
    console.log(val);      // "hello"
});
async function test() {
    throw new Error("ouch");
}

test().catch(err => {
    console.log(err);      // Shows error object with message "ouch"
});
2。当您抛出异常时。异常成为
async
函数返回的承诺的拒绝原因

async function test() {
    return "hello";
}

test().then(val => {
    console.log(val);      // "hello"
});
async function test() {
    throw new Error("ouch");
}

test().catch(err => {
    console.log(err);      // Shows error object with message "ouch"
});
3。当您返回另一个承诺时。该承诺将链接到异步函数返回的承诺,异步函数返回的承诺将跟随您返回的承诺(使用相同值解析时解析,或使用相同原因拒绝)

4。当您不返回任何内容时。这与常规函数中相同,相当于函数块末尾的
返回未定义的
,因此解析值取
未定义的值

那么这个,

async function test() {
    console.log("hi");
}

test().then(val => {
    console.log(val);      // undefined
});
工作原理与th完全相同