如何找到promise创建的位置?

问题描述 投票:0回答:1

我几天前发布了这个问题,然后在我被指出它基本上没有说明我正在处理的问题后将其删除了。然后我被要求恢复问题,但我仍然需要修改它以清楚地显示我遇到的问题。


对于 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()');
  });
}

这里几乎无法使用调用堆栈,因为很明显,完成特定异步调用的调用堆栈早已不复存在。

example code paused in chrome dev-tools debugger

有没有类似的方法可以看到“承诺链”之类的东西?

问题是关于一般的 JS,不一定是 Node.js、Chrome 开发工具等。恰好我在这个例子中使用了这个堆栈。

javascript node.js ecmascript-6 google-chrome-devtools es6-promise
1个回答
0
投票

不,这通常是不可能的。

对于异步解析处理程序,可能会感兴趣三种“调用堆栈状态”:

  • 创建承诺的地方:
    new Promise()
  • 连接处理程序的那个:
    .then()
  • 约定的那个:
    resolve()

您的开发工具中只有第二个可用,即“异步调用堆栈”,在您的屏幕截图中也可见。这也与您在使用 await 时获得的异步堆栈跟踪

 相匹配,其中它实际上是等待恢复的挂起函数的堆栈,这 
使此选择更加高效 通常这也是最有趣、最有用的。创建 Promise 的地方(函数调用,示例中的

getPromise()

)通常离您不远,如果您确实需要,您可以在那里放置一个断点来单步执行 Promise 创建,这也会引导您解决承诺的代码(在执行程序内部,在您的示例中为

resolve('in getPromise')
)。
    

© www.soinside.com 2019 - 2024. All rights reserved.