当异步

时间:2019-08-08 09:21:48

标签: javascript async-await

我一直在玩arguments.callee,偶然发现了这个问题。

我的想法是匿名功能将在启动时运行,然后在几秒钟后再次运行。

setTimeout(async function() {
  console.log('Not working')
  return arguments.callee
}(), 1000)

如果我的匿名功能不是async

,我没有任何问题

setTimeout(function() {
  console.log('Working just fine')
  return arguments.callee
}(), 1000)

让我感到困惑的是,当我在console.log(arguments.callee)函数中async时,它就很好了。

setTimeout(function() {
  console.log(arguments.callee)
}, 1000)

setTimeout(async function() {
  console.log(arguments.callee)
}, 2000)

有人可以向我解释为什么该功能为async时不起作用吗?

1 个答案:

答案 0 :(得分:3)

这是因为当您从async函数返回内容时,它包装在 Promise 中,因此arguments.callee实际上是该函数您想返回,但它包装在一个诺言中。

来自MDN

  

异步函数是异步运行的函数   通过事件循环,使用隐式Promise返回其结果。

(async function() {
  console.log('Not working')
  return arguments.callee
}()).then((fun) => fun());
//the wrapped function can be executed in the chained then callback

正如@ Oliver Nybo在评论中指出的那样,我们还可以在await上下文中使用async来等待使用函数值解决承诺:

(async () => {
  setTimeout(await async function() {
    console.log('Not working');
    return arguments.callee;
  }(), 1000)
})();