我有一个返回承诺的函数,像这样。我希望从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();
答案 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,也可以通过代码转换和插件来实现。