gpt4 book ai didi

javascript - 异步函数 promise 何时解决?

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:23 24 4
gpt4 key购买 nike

我有以下代码:

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返回的 promise 永远不应该被实现。因此 console.log("main") 永远不应该被执行。但是它是在 console.log("two") 之后执行的。有人可以向我解释一下吗?

最佳答案

Noticed func2 never returns a value, the promise returned by func2 should never be fullfilled in my opinion.

这不是异步函数的工作原理。 func2 执行完成后返回。没有return语句的函数的返回值是特定值undefined。因此,undefined 成为 Promise 的解析值。请记住,在 Javascript 中,undefined 是一个特定值。就好像您在函数 block 末尾return undefined 一样。因此,由于 undefined 是返回值,因此它成为 async Promise 的解析值。

<小时/>

为了完全覆盖所有基础,async 函数始终返回一个 promise ,并且该 promise 通过以下方式之一获取已解决/拒绝的值:

<强>1。当您从函数中显式返回一个值时。该值将成为async函数返回的 promise 的解析值。

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

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

<强>2。当您抛出异常时。异常将成为 async 函数返回的 Promise 的拒绝原因。

async function test() {
throw new Error("ouch");
}

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

<强>3。当您返回另一个 Promise 时。该 Promise 链接到异步函数返回的 Promise,并且异步函数返回的 Promise 将遵循您返回的 Promise(当它以相同的值解析时解析或以相同的原因拒绝)。

async function test() {
return new Promise(resolve => {
setTimeout(() => {
resolve("hi");
}, 1000);
});
}

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

<强>4。当您不返回任何内容时。这与常规函数相同,相当于在函数 block 末尾return undefined,因此解析的值采用undefined的值。

所以,这个:

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

关于javascript - 异步函数 promise 何时解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51201723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com