我使用如下所示的process.binding('util').getPromiseDetails
来获取承诺状态,并使用返回承诺的节点dns
模块函数。然后,我查询该承诺是否以同步方式解析,但结果总是显示承诺未解析,即使答案通常以毫秒为单位。
const { Resolver } = require('dns').promises;
const resolver = new Resolver();
let a = resolver.resolve4('example.org');
let time = Date.now();
while (time + 10000 > Date.now()) {
console.log(process.binding('util').getPromiseDetails(a));
}
我的问题是,我们是否需要堆栈为空,以便即使内部承诺也标记为已解析?我知道then
处理程序在堆栈为空时运行,但内部承诺是否仅在堆栈为空时标记为已解析?
如果promise的解析需要堆栈为空才能在堆栈为空时标记为已解析,那么我如何能够添加debugger;
语句并等待,并且当我检查promise时(在代码仍暂停的情况下等待一段时间后),即使在代码暂停时堆栈不为空,它也会被解析。
例如:
let a = fetch('google.com');
debugger;
console.log("hello");
现在,我可以等待并查看a
是否得到满足,即使我还没有恢复代码,如果我还没有恢复代码,堆栈仍然是满的,那么a
如何得到满足呢?
1条答案
按热度按时间ogsagwnx1#
我们是否需要堆栈为空,以便即使内部承诺也标记为已解决?
不,运行时可以随时将其内部创建的承诺标记为已解决(尽管它可能需要在作业队列上使用某种信号量锁),如示例中的
fetch
所示。但是,dns/promises
resolve
方法不构造内部承诺。它是从JS代码创建的,并从事件处理程序解析,该事件处理程序是从本机代码调度调用的。此处理程序代码确实需要空堆栈才能运行,因此在代码被阻止一秒钟并检查承诺时,它尚未运行。