第125篇: 期約Promise基本特性

来源:https://www.cnblogs.com/FatTiger4399/archive/2023/03/03/17177064.html
-Advertisement-
Play Games

好家伙,本篇為《JS高級程式設計》第十章“期約與非同步函數”學習筆記 1.非重入期約 1.1.可重入代碼(百度百科) 先來瞭解一個概念 可重入代碼(Reentry code)也叫純代碼(Pure code)是一種允許多個進程同時訪問的代碼。 為了使各進程所執行的代碼完全相同,故不允許任何進程對其進行修 ...


好家伙,本篇為《JS高級程式設計》第十章“期約與非同步函數”學習筆記

 

1.非重入期約

1.1.可重入代碼(百度百科)

先來瞭解一個概念

可重入代碼(Reentry code)也叫純代碼(Pure code)是一種允許多個進程同時訪問的代碼。

為了使各進程所執行的代碼完全相同,故不允許任何進程對其進行修改。

程式在運行過程中可以被打斷,並由開始處再次執行,並且在合理的範圍內(多次重入,而不造成堆棧溢出等其他問題),

程式可以在被打斷處繼續執行,且執行結果不受影響。

                                            ----來自百度百科

 

1.2.非重入期約

非重入期約方法 期約進入 落定(解決/拒絕)狀態時,與該狀態相關的處理程式不會立即執行 ,

處理程式後的 同步代碼 會在其之前 先執行 ,該特性稱為非重入

當期約進入落定狀態時,與該狀態相關的處理程式僅僅會被排期,而非立即執行。

跟在添加這個處 理程式的代碼之後的同步代碼一定會在處理程式之前先執行。

即使期約一開始就是與附加處理程式關聯 的狀態,執行順序也是這樣的。

這個特性由 JavaScript 運行時保證,被稱為“非重入”(non-reentrancy) 特性。

 

let promise = new Promise(() => {
    console.log("5")
})

// 創建一個期約並將解決函數保存在一個局部變數中
let p = new Promise((resolve) => {
    synchronousResolve = function () {
        console.log('1');
        resolve();
        console.log('2');
    };
    synchronousResolve();
});
p.then(() => console.log('4'));
console.log('3');

 

看到了嗎,這裡4依舊被放在了最後輸出

這說明在這個例子中,即使期約狀態變化發生在添加處理程式之後,處理程式也會等到運行的消息隊列讓 它出列時才會執行。

 

 

 

2.鄰近處理程式的執行順序

如果給期約添加了多個處理程式,當期約狀態變化時,相關處理程式會按照添加它們的順序依次執行

let p1 = Promise.resolve(); 
p1.then(() => setTimeout(console.log, 0, 1)); 
p1.then(() => setTimeout(console.log, 0, 2)); 
p1.then(() => setTimeout(console.log, 0, 3)); 
p1.then(() => setTimeout(console.log, 0, 4)); 

 

 

 

 

3.期約連鎖

把期約逐個地串聯起來是一種非常有用的編程模式。

之所以可以這樣做,是因為每個期約實例的方 法(then()、catch()和 finally())都會返回一個新的期約對象,

而這個新期約又有自己的實例方,這樣連綴方法調用就可以構成所謂的“期約連鎖”

你應該能想象到,這就是一長串then(),( then()、catch()和 finally()都行 )

let p = new Promise((resolve, reject) => {
    resolve();
});
p.then(() => console.log('1'))
    .then(() => console.log('2'))
    .then(() => console.log('3'))
    .then(() => console.log('4'));

 

 

 

 

4.期約合成

這肯定是個將多個期約合成為一個的某個特性(廢話)

Promise 類提供兩個將多個期約實例組合成一個期約的靜態方法:Promise.all()和 Promise.race()。

而合成後期約的行為取決於內部期約的行為。


4.1.Promise.all()

特性一:合成的期約只會在每個包含的期約都解決之後才解決

特性二:如果至少有一個包含的期約待定,則合成的期約也會待定。

如果有一個包含的期約拒絕,則合成的 期約也會拒絕

let p1 = Promise.all([
    Promise.resolve(),
    new Promise((resolve, reject) => {
        resolve();
    })
]);
console.log("I'm p1");
console.log(p1);

// 一次拒絕會導致最終期約拒絕
let p2 = Promise.all([
    Promise.resolve(),
    Promise.reject(),
    Promise.resolve()
]);
console.log("I'm p2");
console.log(p2);

let p3 = Promise.all([
    Promise.resolve(),
    new Promise(() => {}),
    Promise.resolve()
]);
console.log("I'm p3");
console.log(p3);

 

 

 

 

4.2.Promise.race()

Promise.race()不會對解決或拒絕的期約區別對待。

無論是解決還是拒絕,只要是第一個落定的 期約,Promise.race()就會包裝其解決值或拒絕理由並返回新期約

let p1 = Promise.race([
    Promise.resolve(),
    new Promise((resolve, reject) => {
        resolve();
    })
]);
console.log("I'm p1");
console.log(p1);

// 一次拒絕會導致最終期約拒絕
let p2 = Promise.race([
    Promise.resolve(),
    Promise.reject(),
    Promise.resolve()
]);
console.log("I'm p2");
console.log(p2);

let p3 = Promise.race([
    Promise.resolve(),
    new Promise(() => {}),
    Promise.resolve()
]);
console.log("I'm p3");
console.log(p3);

 

 

 

 

5.課後練習

 

1.什麼是promise期約連鎖?

  答:Promise期約連鎖調用是使用Promise的一種技術,它可以讓你把多個Promise以鏈式的方式組合起來,每個Promise的結果作為下一個Promise的輸入。

這樣可以把複雜的操作分解成一系列簡單的操作,以便更容易理解和管理。

 

2.如何解釋Promise的的非重入特性?

  答:非重入期約方法 期約進入 落定(解決/拒絕)狀態時,與該狀態相關的處理程式不會立即執行 ,

 

處理程式後的 同步代碼 會在其之前 先執行 ,該特性稱為非重入

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇介紹了springboot的代碼壓縮實現,本地調試也是沒有問題,但是當項目部署至伺服器就不行了,還需要Linux配置和下載壓縮所需要的工具ffmpeg,我們伺服器用的是centos7,下麵開始實現步驟。 第一步、先在Linux伺服器配置及下載壓縮插件 一、找到下載目錄 cd /usr/loca ...
  • 環境: DNS伺服器:192.168.10.200 僅主機模式 internet伺服器:192.168.10.123 僅主機模式 web1:10.0.0.100 (安裝apache2)NAT模式 web2:10.0.0.18 (安裝httpd) NAT模式 HAProxy伺服器:10.0.0.8(配 ...
  • 袋鼠雲數棧從2016年發佈第⼀個版本開始,就始終堅持著以技術為核⼼、安全為底線、提效為⽬標、中台為戰略的思想,堅定不移地⾛國產化信創路線,不斷推進產品功能迭代、技術創新、服務細化和性能升級。 在數棧過去的產品迭代中受限於當前組件的版本,積累了很多待解決的問題,隨著新的功能需求不斷增加,很多原先的組件 ...
  • 1.instantclient工具 下載安裝Oracle資料庫的客戶端連接工具“instantclient”,該工具是遠程連接Oracle資料庫的前提,不管是使用PL/SQL或應用程式訪問資料庫都必須安裝該工具。 下載地址:鏈接:https://pan.baidu.com/s/1glZGRJeQ-W ...
  • MySQL主鍵和外鍵知識點 | 主鍵的概念 | 主鍵的創建 | desc 表名 | show create table 表名; | 自增列起 始值設置 | 設置自增列初始值語句 | 自增列步長設置 | 唯一索引知識點 | 創建唯一索引的方式 | 外鍵變種 詳細知識點 | 什麼是外鍵變種 | 外鍵變種... ...
  • 案例需求: 假設用戶需要每個1秒鐘需要統計4秒鐘 視窗中數據的量,然後對統計的結果值進行checkpoint處理 ##### 數據規劃 使用自定義運算元每秒鐘產生大約10000條數據 產生的數據為一個四元組(Long,String,String,Interger)-- (id,name,info,co ...
  • 資料庫系統概論—基礎篇(1) 一、緒論 1.資料庫系統概述 1.1資料庫四個基本概念 數據:描述事物的符號記錄 資料庫(DB):存放數據的倉庫 資料庫管理系統(DBMS):位於用戶與操作系統之間的一層數據管理軟體 資料庫系統(DBS):由資料庫,資料庫管理系統,應用程式和資料庫管理員組成 1.2數管 ...
  • 前言 內容類應用中圖片或文件下載,一般應用中應用更新和升級,這些都是經典的下載場景。下載是項目中基礎且重要的模塊。 從代碼邏輯復用性和人力成本考慮,一直想實現一個純Dart實現的下載庫,作為技術儲備。 最近發現了一個純Dart實現的下載庫flutter_download_manager,相對來說各方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...