我几天前发布了这个问题,然后在我被指出它基本上没有说明我正在处理的问题后将其删除了。然后我被要求恢复问题,但我仍然需要修改它以清楚地显示我遇到的问题。
对于 JavaScript Promise,在其“已解析处理程序”中如何找到(如果可能的话)这个特定 Promise 的创建位置?
例如在这种情况下,使用这段代码(与 async/await 似乎没有区别),当代码执行在
debugger
语句上停止时,如何查看相应的 Promise 是在哪里创建的:
'use strict';
const promise = getPromise();
handleResolution(promise);
function handleResolution(promiseArg) {
promiseArg
.then((resolution) => {
debugger;
console.log(`resolved with: ${ resolution }`);
});
}
function getPromise() {
return new Promise((resolve) => {
resolve('in getPromise()');
});
}
这里几乎无法使用调用堆栈,因为很明显,完成特定异步调用的调用堆栈早已不复存在。
有没有类似的方法可以看到“承诺链”之类的东西?
问题是关于一般的 JS,不一定是 Node.js、Chrome 开发工具等。恰好我在这个例子中使用了这个堆栈。
不,这通常是不可能的。
对于异步解析处理程序,可能会感兴趣三种“调用堆栈状态”:
new Promise()
.then()
resolve()
您的开发工具中只有第二个可用,即“异步调用堆栈”,在您的屏幕截图中也可见。这也与您在使用 await
时获得的异步堆栈跟踪
相匹配,其中它实际上是等待恢复的挂起函数的堆栈,这使此选择更加高效。 通常这也是最有趣、最有用的。创建 Promise 的地方(函数调用,示例中的
getPromise()
)通常离您不远,如果您确实需要,您可以在那里放置一个断点来单步执行 Promise 创建,这也会引导您解决承诺的代码(在执行程序内部,在您的示例中为
resolve('in getPromise')
)。