从promise.then / promise.catch中获取原始函数名称

时间:2018-10-11 04:38:20

标签: javascript function promise

我有一个返回承诺的函数,像这样。我希望从promise回调(.then.catch中找到原始函数的名称("myFunction")。该怎么做?

function myFunction() {
  return fetch('https://example.com')
    // The promise will fail because Stackoverflow is sandboxed
    .catch(function() {
      console.log(JSON.stringify(arguments.callee.name))
      // It is returning the name of my anonymous function ("").
      // I want it to log "myFunction" instead.
    })
}

myFunction();

2 个答案:

答案 0 :(得分:3)

您可以将arguments保存到catch闭包之外的另一个变量。

function myFunction() {
  let args = arguments;
  return fetch('https://example.com')
    // The promise will fail because Stackoverflow is sandboxed
    .catch(function() {
      console.log(JSON.stringify(args.callee.name))
      // It is returning the name of my anonymous function ("").
      // I want it to log "myFunction" instead.
    })
}

myFunction();

答案 1 :(得分:2)

没有不能在严格模式下运行的方法,并且不推荐使用(如choz所说)。 这是故意的,目的是为了防止潜在的泄漏并启用诸如SES之类的功能。它也与缩小器一起中断。

choz已经很好地解释了如何在宽松模式和旧环境中执行此操作。

使用异步函数(通过使用new Error().stack)时,可以从带有异步堆栈跟踪的堆栈跟踪中获取此信息,这可以保证正常工作并且可以用于将来。但是,没有计划在不使用异步等待时开发用于promise的异步堆栈跟踪,并且异步堆栈跟踪用于上周真正降落在V8中的生产,因此需要一段时间才能使用。

如果使用babel或TypeScript,也可以通过代码转换和插件来实现。