成人免费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安全

2021-04-21 09:28:17

字節面試官SetTimeout

2023-12-20 14:35:37

Java虛擬線程

2021-10-25 08:49:32

索引數據庫MySQL

2016-12-14 12:02:01

StormHadoop大數據

2017-02-14 14:20:02

StormHadoop

2022-12-27 08:39:54

MySQL主鍵索引

2023-07-05 08:17:38

JDK動態代理接口

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技術棧公眾號

主站蜘蛛池模板: 国产第一区二区 | 成av在线 | 成年人免费在线视频 | 一级欧美日韩 | 黄色三级免费网站 | 欧美一级在线 | 自拍偷拍中文字幕 | 天天综合久久 | 女人夜夜春 | 成人a视频在线观看 | 国内精品久久久久久 | 精品动漫一区 | 日韩欧美一区二区三区 | 精品www| 日韩福利电影 | 色综合久久天天综合网 | 91影院在线观看 | 国产精品久久久久无码av | 天天干视频 | 午夜精品三区 | 国产一区二区在线视频 | 日韩精品视频在线免费观看 | 亚洲国产成人精品久久久国产成人一区 | 欧美成人久久 | 国产在线视频一区二区 | 网站黄色在线免费观看 | 国产精品区二区三区日本 | 国产精品欧美一区二区三区不卡 | 午夜精品久久久久久久99黑人 | 精品香蕉一区二区三区 | 污视频在线免费观看 | 超碰在线免费公开 | 中文字幕在线精品 | 成人影音| 浮生影院免费观看中文版 | 国产一区二区a | 雨宫琴音一区二区在线 | 亚洲欧洲一区 | 欧美激情视频一区二区三区免费 | 午夜网| 免费久久久久久 |