成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:為什么 Promise 比setTimeout() 快?

開發 前端
我們來做個實驗。哪個執行得更快:立即解決的 Promise 還是立即setTimeout(也就是0毫秒的setTimeout)?

[[377365]]

本文已經過原作者 devinduct 授權翻譯。

1.實驗

我們來做個實驗。哪個執行得更快:立即解決的 Promise 還是立即setTimeout(也就是0毫秒的setTimeout)?

  1. Promise.resolve(1).then(function resolve() { 
  2.   console.log('Resolved!'); 
  3. }); 
  4.  
  5. setTimeout(function timeout() { 
  6.   console.log('Timed out!'); 
  7. }, 0); 
  8.  
  9. // 'Resolved!' 
  10. // 'Timed out!' 

promise.resolve(1)是一個靜態函數,它返回一個立即解析的promise。setTimeout(callback, 0)以0毫秒的延遲執行回調函數。

我們可以看到先打印'Resolved!',再打印Timeout completed!,立即解決的 promise 比立即setTimeout更快。

是因為Promise.resolve(true).then(...)在setTimeout(..., 0)之前被調用了,所以 Promise 過程會更快嗎?公平的問題。

所以,我們稍微更改一下實驗條件,然后先調用setTimeout(..., 0):

  1. setTimeout(function timeout() { 
  2.   console.log('Timed out!'); 
  3. }, 0); 
  4.  
  5. Promise.resolve(1).then(function resolve() { 
  6.   console.log('Resolved!'); 
  7. }); 
  8.  
  9. // 'Resolved!' 
  10. // 'Timed out!' 

setTimeout(..., 0)在Promise.resolve(true).then(...)之前被調用。但,還是先打印Resolved!在打印'Timed out!'。

這是為啥呢?

2.事件循環

與異步 JS 相關的問題可以通過研究事件循環來回答。我們回顧一下異步 JS 工作方式的主要組成部分。

 

調用堆棧是一個LIFO(后進先出)結構,它存儲在代碼執行期間創建的執行上下文。簡單地說,調用堆棧執行這些函數。

Web api是異步操作(fetch 請求、promise、計時器)及其回調等待完成的地方。

**task queue (任務隊列)是一個FIFO(先進先出)**結構,它保存準備執行的異步操作的回調。例如,超時的setTimeout()的回調函數或準備執行的單擊按鈕事件處理程序都在任務隊列中排隊。

**job queue (作業隊列)**是一個FIFO(先入先出)結構,它保存準備執行的promise 的回調。例如,已完成的承諾的resolve或reject回調被排在作業隊列中。

最后,事件循環永久監聽調用堆棧是否為空。如果調用堆棧為空,則事件循環查看作業隊列或任務隊列,并將準備執行的任何回調分派到調用堆棧中。

3.作業隊列與任務隊列

我們從事件循環的角度來看這個實驗,我將對代碼執行進行一步一步的分析。

A)調用堆棧執行setTimeout(..., 0)并計劃一個計時器, timeout()回調存儲在Web API中:

 

B)調用堆棧執行 Promise.resolve(true).then(resolve)并安排一個 promise 解決方案。resolved()回調存儲在Web API中:

 

C)promise 立即被解析,同時計時器也立即執行。這樣,定時器回調timeout()進入任務隊列,promise回調resolve()進入作業隊列

 

D)現在是有趣的部分:作業隊列(微任務)優先級高于任務隊列(宏任務)。事件循環從作業隊列中取出promise回調resolve()并將其放入調用堆棧中。然后,調用堆棧執行promise回調resolve():

 

E)最后,事件循環將計時器回調timeout()從任務隊列中出隊到調用堆棧中。然后,調用堆棧執行計時器回調timeout():

 

調用堆棧為空,已完成腳本的執行。

總結

為什么立即解決的 promise 比立即執行定時器處理得更快?

由于事件循環優先級的存在,因此與任務隊列(存儲超時的setTimeout()回調)相比,作業隊列(用于存儲已實現的Promise回調)的優先級更高。

完~ 我是小智,我要去刷碗了,我們下期見!

 

作者:Milos Protic 譯者:前端小智 來源:devinduct原文:https://dmitripavlutin.com/javascript-promises-settimeout/

本文轉載自微信公眾號「 大遷世界」,可以通過以下二維碼關注。轉載本文請聯系 大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2023-06-05 07:57:53

Kafka消息事務消息

2025-06-18 08:20:00

Redis數據庫線程

2021-01-13 10:51:08

PromissetTimeout(函數

2022-07-06 13:48:24

RedisSentinel機制

2023-12-06 09:10:28

JWT微服務

2020-10-24 15:50:54

Java值傳遞代碼

2021-02-19 10:02:57

HTTPSJava安全

2021-12-20 10:30:33

forforEach前端

2021-05-13 07:58:05

HTTPSHTTP安全

2023-12-20 14:35:37

Java虛擬線程

2021-04-21 09:28:17

字節面試官SetTimeout

2021-10-25 08:49:32

索引數據庫MySQL

2022-12-27 08:39:54

MySQL主鍵索引

2023-07-05 08:17:38

JDK動態代理接口

2016-12-14 12:02:01

StormHadoop大數據

2017-02-14 14:20:02

StormHadoop

2022-12-22 14:32:37

JavaScript編程語言

2021-09-07 10:44:33

Java 注解開發

2020-08-24 10:55:41

數據庫雙寫代碼

2023-11-30 08:16:19

SpringjarTomcat
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.日日干 | 天天艹 | 色综合99 | 九九看片 | 欧美亚洲日本 | 久久高清| 日日夜夜天天 | 国产一区二区三区四区五区加勒比 | 国产精品资源在线 | 天天爽一爽 | 毛片在线免费 | 日本亚洲精品 | 超碰在线国产 | 看av网址 | 国产一区二区在线看 | 99热热热热 | 成人依人 | 丁香综合 | 91精品国产综合久久福利软件 | 婷婷丁香综合网 | 国产激情综合五月久久 | 91在线观看 | 亚洲一区电影 | 91在线视频网址 | 久久久精品 | 久久久久久久久久久久久久久久久久久久 | 久久久久久成人 | 亚洲视频不卡 | 国产夜恋视频在线观看 | 国产精品视频一区二区三区 | 精品视频一区二区三区在线观看 | 久久国产精品一区二区三区 | 亚洲一区二区三区四区五区中文 | 国产乱码精品一区二区三区中文 | 国产精品a久久久久 | 欧美日韩精品在线一区 | 中文字幕一区二区三区精彩视频 | 久久久久www | 一级黄色片免费在线观看 | 日韩亚洲欧美一区 | 97精品国产97久久久久久免费 |