function scaryClown() {
return new Promise(resolve => {
setTimeout(() => {
resolve('a')
}, 1000)
});
}
function msg2() {
const msg2 = async () => {
const result = await scaryClown()
console.log(result)
}
msg2()
}
async function msg() {
const result = await scaryClown()
console.log(result)
}
msg和msg2这两个函数有什么区别?
答案 0 :(得分:3)
msg
返回一个承诺,msg2
(外部)不返回。这意味着调用msg
的代码可以知道异步操作何时完成,但是调用msg2
的代码则不可能。
(msg2
也无法处理拒绝或将链传递给调用者,因此调用者可以处理拒绝,这违反了承诺的基本规则之一:始终处理拒绝或返回链。 )
答案 1 :(得分:2)
让我们逐步了解这一点。
1st)这两个函数在执行后都会产生类似的输出,即
a
2nd)msg
函数仅使用await
语法。在这种情况下,只有一个函数调用,因此事件循环和调用堆栈中只有一个函数。名为scaryClown()
的函数将添加到调用堆栈中,然后执行。
3rd)msg2
函数具有另一个变量,即const msg2
,其中包含该函数。因此,这种方法首先增加了一个额外的声明。其次,当调用函数msg2
时,它将内部调用内部声明的msg2
,从而增加了一个函数调用,并将其添加到调用堆栈中。现在,事件循环等待内部msg2
执行,然后从堆栈中清除它。然后,外部msg2
执行完成。
要进一步了解事件循环和调用堆栈的主题,可以参考本文-asynchronous javascript event loop