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完全相同