簡體   English   中英

promise 是否需要調用堆棧為空才能得到解決

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM