為什麼不依賴微任務模擬出的 Promise,也能符合 Promises A 規範?

時間 2021-05-06 19:42:55

1樓:伊撒爾

promise/A+ 和 microtask 的關係其實不大,準確來說,瀏覽器中的 event loop 和 node 等 js 引擎中的 event loop 也不是乙個東西,後者就單純只是 js 層的排程

瀏覽器很大的不同在於它混入了瀏覽器行為

所以其實本質上來說,即便是 promiseA+ 也無法準確模擬「瀏覽器中的 microtask」,自然,利用 microtask 特性的框架,比如 vue,preact 等 react15-like 框架,也無法通過 promise 的 polyfill 進行對等模擬

當然,還有另一種框架,它們企圖擺脫瀏覽器自己排程,比如 fre

它內部的 microtask 是和瀏覽器無關的,甚至和 promise 無關,所以本質上僅僅只是利用了類似的概念而已

總的來說,promiseA+ 和瀏覽器中的 microtask 關係不大,promiseA+ 本身也只是用來面試,瀏覽器行為是很難模擬的

更新:不能一概而論,即便是面試我覺得也不能一概而論,因為大家在理解上存在一些誤差

因為我是寫 js 框架的,所以我把瀏覽器行為看的很重要的,因為實際上 fre 一直在搞的,說白了就是重新排程瀏覽器行為

但是如果你專注於搞其他領域,可能對瀏覽器行為不是很敏感

所以真的不能一概而論,其實一般來說,面試官如果問到我,我會給他說好前提

比如你是問 node 的 event loop 還是 chrome 的?

2樓:貓5號

promise在巨集微之間抉擇本來就是乙個邊界情況。當初類似jq這類工具庫推出類似deferred這類feature的時候,也沒有仔細測試巨集微的區別。這肯定是在promise漸漸步入正軌才補充的邊界情況

實際上在當時有沒有巨集任務和微任務這個概念也不好說,反正我菜沒聽說所以說是不是個bug,那不算吧

至於墊片導致的問題,我覺得倒是不嚴重

因為要在promise上體現出巨集微本身就是個邊界情況,甚至是個bad practice,是應該避免的

至於對promise的時序問題的面試題,是不是吹毛求疵,那得看情況,只能說,有那嫌疑。反正我一般是不問的。

3樓:winter

個人觀點,之所以要搞出微任務這一卦東西,完全是因為JS引擎內外之別,在Promise之前,JS規範對JS引擎完全沒有非同步能力的要求,所以主流環境裡都是靠host能力來實現非同步。

有了Promise之後,這個問題被拍到臉上,又沒法假設host必須有任務佇列,再假設自己能往裡插任務,只好自己再搞乙個出來,於是有了一大一小兩套任務系統,組合出各種奇特的非同步執行次序。

所以回答題:

Promises/A+ 的規範制定是否有漏洞?沒有微任務跟 Promise,是否並不必有強繫結的關係?是的某些死磕 Promise 執行順序的面試題,是否在吹毛求疵?是的

4樓:黃玄

在 ES6 以前不支援 Promise 的環境下,通常只能靠 setTimeout 回退到傳統的 Task 來模擬 Promise。但實際業務中,並沒有感受到此類沒有依賴微任務的 polyfill 有什麼嚴重的可用性問題。

「嚴重的可用性問題」應該是沒有,畢竟 mircotask 只是從 scheduler 的角度上來說比 macrotask 有更高的優先順序。Jake Archibald 寫過一些 edge cases 表示(不同 host)diverging from spec 的話會有一些行為不一致(比如哪個 callback 先執行),影響 interoperability。而且實際上,microtask 因為「優先順序更高」所以可能出 bug(比如 block renderer thread)的程式集合比 macrotask 要大,所以乙個 host 實現將 microtask 退化到 macrotask 的話並不會引入新 bug,只是在「spec 定義應該出 bug」的場合下並不表現出 bug 的行為。

乙個例子是,React Native 至今也沒有支援 microtask,Promise polyfill 是用 setImmediate 然後走 macrotask 得,雖然一直在計畫中但是好像沒太多 motivation 做這件事。

所以下面的這些命題是否成立呢:

1. Promises/A+ 的規範制定是否有漏洞?

Promise/A+ 本身說得就是「都可以」,題主偷懶了沒仔細看

orsetImmediate

, or with a 「micro-task」 mechanism such asMutationObserver

orprocess.nextTick

2. 微任務跟 Promise,是否並不必有強繫結的關係?

從概念來說:不必要

從 JS(EMCA262 spec)的乙個 Promise 實現來說,不必要

從瀏覽器作為 host 實現 Web APIs spec 的角度來說,必要

(詳見 @Shulamith 回答)

3. 某些死磕 Promise 執行順序的面試題,是否在吹毛求疵?

不予評價。

現實生活中,並不依賴母親,但為什麼總自言自語叫「媽媽」?

葉濤 我非常渴望母愛,平時路上沒人也會叫媽媽,感覺叫出來很開心,後來有女友,也常叫女友媽媽,我想這可能是戀母嚴重的表現,不過我生活一切正常,只是想叫媽媽,沒有其它不正常表現。 心之愛心理諮詢 心之愛心理諮詢師 嬰兒誕生之初就需要媽媽提供乙個呵護的 溫暖的 安全的環境,滿足嬰兒各種基本生存需求,無論物...

為什麼沒有人可以編寫乙個能不依賴人為輸入地編寫程式的程式?

可以啊,很好寫 比如用python print print Hello world 你看,不依賴人的輸入就寫出了個Hello world 機器造機器,那是因為,機器是按個數成本來算的。按照題主的意思,程式造程式,CTRL C,CTRL V不就得了?你只需要準備足夠大的硬碟就夠了。 你怎麼向計算機描述...

為什麼熱力學溫標不依賴於測溫物質,它的零點是怎樣確定的?

溫度可以認為是衡量粒子熱運動劇烈程度的尺度。0K相當於是利用物理學公式推導出的理論上微觀粒子不運動,形成最低能量狀態時的 溫度 記得老師曾經提過,為了接近絕對零度,最後快到極限的那一段已經不是依靠傳導對流輻射之類的來降低了,而是把乙個通過磁性微觀上排列整齊的物質送到低溫環境內,讓環境裡僅存的能量擾動...