非异步函数内部的异步函数与异步函数?

时间:2019-11-29 10:08:57

标签: javascript

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这两个函数有什么区别?

2 个答案:

答案 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