![](/img/trans.png)
[英]Why do we need to convert an Observable to Promise to get a resolved value?
[英]Does promise need call stack to be empty to get resolved
我使用process.binding('util').getPromiseDetails
如下所示獲取 promise 狀態,我使用節點dns
返回 promise 的模塊函數。然后我查詢 promise 是否以同步方式解析,但結果始終顯示 promise 未解析即使答案通常以毫秒為單位。
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));
}
我的問題是我們是否需要堆棧為空,以便即使在內部 promise 也被標記為已解決。 我知道then
處理程序在堆棧為空時運行,但內部 promise 是否僅在堆棧為空時標記為已解析?
如果 promise 的分辨率需要堆棧為空才能在堆棧為空時標記為已解決,我該如何添加debugger;
聲明並等待,當我檢查 promise(等待一段時間后代碼仍然暫停)時,它已解決,即使堆棧不為空,因為代碼暫停。
例如:
let a = fetch('google.com');
debugger;
console.log("hello");
我現在可以等着看a
是否已經完成,即使我還沒有恢復代碼,所以如果我沒有恢復代碼並且堆棧仍然是滿的,那么a
如何完成?
我們是否需要堆棧為空,以便即使在內部 promise 也被標記為已解決?
不,運行時可以隨時將它在內部創建的承諾標記為已解決(盡管它可能需要在作業隊列上使用某種信號量鎖),如示例中的fetch
所示。
然而, dns/promises resolve
方法並沒有構造一個內部的 promise。它是從 JS 代碼創建的,並從一個從本機代碼調用的事件處理程序中解析。 此處理程序代碼確實需要一個空堆棧才能運行,因此當您的代碼被阻塞一秒鍾並檢查 promise 時,它還沒有運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.