NodeJS promise是否需要调用堆栈为空才能得到解析

ubof19bj  于 2023-01-30  发布在  Node.js
关注(0)|答案(1)|浏览(122)

我使用如下所示的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如何得到满足呢?

ogsagwnx

ogsagwnx1#

我们是否需要堆栈为空,以便即使内部承诺也标记为已解决?
不,运行时可以随时将其内部创建的承诺标记为已解决(尽管它可能需要在作业队列上使用某种信号量锁),如示例中的fetch所示。
但是,dns/promisesresolve方法不构造内部承诺。它是从JS代码创建的,并从事件处理程序解析,该事件处理程序是从本机代码调度调用的。此处理程序代码确实需要空堆栈才能运行,因此在代码被阻止一秒钟并检查承诺时,它尚未运行。

相关问题