Promise和回調地獄

順序執行 vs. 異步操作:

當我們說“順序執行”,通常是指 操作按順序發生。而 異步操作 指的是操作在后臺執行,不會阻塞其他操作,通常會使用回調、Promiseasync/await 來處理結果。

Promise 鏈式調用 的情況下,雖然每個 .then()按順序執行 的,但這些操作本身都是 異步的,這意味著每個 .then() 執行時,前一個操作的結果是異步得到的,不會阻塞后續操作的執行。

順序與異步的混合:

當我們使用 Promise 時,順序異步 是兩個不同的概念,它們結合在一起工作。

順序執行
  • 你在 .then() 鏈中編寫的每個操作是 順序執行的,即每個操作都等待前一個操作的完成再執行。
異步執行
  • 每個 .then() 返回的 Promise異步的,它不會阻塞主線程的執行。
  • 異步操作仍然會在后臺執行,只有當 Promise 被解析或拒絕時,才會執行相應的回調。

為什么說 .then() 是順序的異步操作?

讓我們用一個具體的例子來說明:

console.log("開始");getData().then(data => {console.log("第一個異步操作完成", data);return processData(data);  // 返回 Promise}).then(parsedData => {console.log("第二個異步操作完成", parsedData);return saveData(parsedData);  // 返回 Promise}).then(savedData => {console.log("第三個異步操作完成", savedData);}).catch(error => {console.log("發生錯誤", error);});console.log("結束");

執行流程

  1. getData():這是一個異步操作,可能是從網絡請求數據或文件。它返回一個 Promise,并繼續執行后續代碼,不會阻塞主線程。

  2. then(data => {...}):當 getData()Promise 被解析后,這個回調函數才會被執行,data 會傳遞給這個回調。如果你有多個 .then(),它們會 按順序 執行,但每個操作本身都是異步的,意味著它們是 非阻塞的

  3. return processData(data):每個 .then() 返回的值(例如 processData())會自動成為下一個 .then() 的輸入。每個返回的操作是 異步的,并且是順序進行的。

  4. 輸出

    • "開始""結束" 會立即輸出,表明主線程沒有被阻塞。
    • 然后,異步操作會按順序執行:第一個 getData() 完成后,第二個 processData() 執行,依此類推。
    • 錯誤處理:如果在任何一個 .then() 中發生錯誤,它會跳到 .catch() 中。

總結

  • 每個 .then() 中的操作 按順序執行,即一個操作等待前一個操作完成后再執行,確保異步操作的順序性。
  • 異步 是指這些操作本身不會阻塞主線程的執行,后臺會并行進行處理。
  • 因此,.then() 是順序執行的異步操作,順序 指的是它們的執行順序,而 異步 指的是每個操作本身不阻塞其他任務的執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91746.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 65:有效數字

LeetCode 65:有效數字問題本質與挑戰 需判斷字符串是否為有效數字,規則涉及整數、小數、指數(e/E)的復雜組合,如: 整數:123、-45、678小數:1.2、.3、4.、5.6指數:1e10、2…

數據結構之順序表應用與雙指針法

元素刪除通過元素移動的方式來模擬刪除操作:將指定下標后的所有元素依次向前移動一位,覆蓋要刪除的元素,從而達到 "刪除" 的效果。 通過自定義函數實現刪除功能,需要傳入數組、數組長度的指針(因為要修改長度…

Python編程基礎與實踐:Python基礎數據類型入門

Python變量與數據類型實踐 學習目標 通過本課程的學習,學員可以掌握Python中變量的基本概念,了解并能夠使用Python的基本數據類型,包括整型、浮點型、字符串和布爾值。此外,學員還將學習如何在實際編程中聲明和使用這些數據類型。…

深入解析C/C++函數變量傳遞:棧、堆與全局變量的生命周期之旅

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在編程學習中,函數是構建程序的基石,而理解變量如何在函數之間正確、安全地傳遞,則是從入門到進階的關鍵一步。我們經常會遇到這樣的困惑:為什么一個指針在某個函數里工作正常,傳遞給另一個函數后卻變成了“…

Ubuntu18網絡連接不上也ping不通網絡配置問題排查與解決方法

Ubuntu 18啟動以后發現連接不上網絡,執行 ip a命令或者ifconfig都顯示不了正確的地址(192.168.xxx.xxx)。 剛裝好系統是沒問題的,打算使用FTP開啟ftp服務與windows互傳文件,安裝了net-tools插件就突然連不上網絡了,懷疑是網絡配置被修改了。 經過了一段時間折騰終于解決了,…

【計算機網絡】Socket網絡編程

目錄 一、主機字節序列和網絡字節序列 二、套接字地址結構 1、IPv4 地址結構 (sockaddr_in) 2、IPv6 地址結構 (sockaddr_in6) 3、通用套接字地址結構 (sockaddr) 4、Unix域套接字地址結構 (sockaddr_un) 5、專用 socket 地址結構 6、套接字地址結構的轉換 字符串轉二進制地址 …

網頁操作自動化解決方案:如何用Browser-Use+CPolar提升企業運營效率

文章目錄前言1. 安裝Ollama2. Gemma3模型安裝與運行3. 虛擬環境準備3.1 安裝Python3.2. 安裝conda4. 本地部署Brower Use WebUI4.1 創建一個新conda環境4.2 克隆存儲庫4.3 安裝依賴環境4.4 安裝瀏覽器自動化工具4.5 修改配置信息5. 本地運行測試6. 安裝內網穿透6.1 配置公網地址…

Pycharm的設置過程

20250802 用于記錄pycharm的設置過程 編輯器相關 python語言設置文件注釋 在設置的編輯器部分,按照需求設置模板! 函數生成注釋

GaussDB as的用法

通過使用 SQL,可以為表名稱或列名稱指定別名(Alias)。1 別名的作用SQL 別名用于為表或表中的列提供臨時名稱。 SQL 別名通常用于使列名更具可讀性。 SQL 一個別名只存在于查詢期間。 提高SQL執行效率與編寫SQL代碼效率。2 使用別名的場景在下…

Prim算法

一,prim算法邏輯1.理解:克魯斯卡爾算法關注的是邊,普里姆算法關注的是點把圖中每個頂點比作孤島,點亮一座孤島就可以解鎖附近的孤島每次解鎖的點都是離自身最近的點2.普里姆算法流程a.采用鄰接矩陣表示,考慮要查找最小…

嵌入式學習之硬件——51單片機 1.0

一、基礎知識1.什么是嵌入式?嵌入式以應用為中心,計算機技術為基礎,軟硬件可裁剪的專用計算機系統;2.嵌入式的應用?消費電子、無人駕駛、儲能、新能源........3.嵌入式發展?(1)第一階…

51c大模型~合集161

自己的原文哦~ https://blog.51cto.com/whaosoft/14079111 #這家國內公司,在給xx智能技術棧做「通解」 打通機器人智能化的關鍵:眼腦手。 xx智能(Embodied Intelligence)是 AI 領域里熱度極高的賽道:給大模型…

Linux9 root密碼修改

開機按e進入在linux行即quiet后面輸入rd.break ctrlx進入內核輸入mount -o remount,rw /sysrootchroot /sysrootpasswd root即可修改密碼輸入touch /.autorelabelexitexit等待即可

提示詞增強工程(Prompt Enhancement Engineering)白皮書草稿

提示詞增強工程(Prompt Enhancement Engineering)白皮書草稿 作者: 技術人進化社 Email:2819699195qq.com 日期: 2025年7月30日 1. 引言 隨著大型語言模型(LLM)能力的飛速發展,如何高…

電路元器件

電流單位 電壓 電阻單位 電阻的決定式 歐姆定律 交流電和直流電 交流電 串聯電路 并聯電路 在線模擬器 Circuitjs web 在線電路模擬器 下載

廣泛分布于內側內嗅皮層全層的速度細胞(speed cells)對NLP中的深層語義分析的積極影響和啟示

速度細胞(Speed Cells)作為內側內嗅皮層(MEC)的核心神經元,通過編碼運動速度信息與網格細胞協同實現動態路徑整合。這一神經機制為自然語言處理(NLP)的深層語義分析提供了以下關鍵啟示和影響&am…

sql中的多表查詢

在SQL中,多表查詢用于從多個表中組合數據,常見的方法包括 ?連接查詢(JOIN)?? 和 ?子查詢。以下是詳細說明和示例:一、連接查詢(JOIN)通過關聯字段將多個表的數據合并,分為以下幾…

Ruby 面向對象編程深入解析

Ruby 面向對象編程深入解析 引言 Ruby 作為一種動態、解釋型、面向對象的語言,自1995年由日本程序員Yukihiro Matsumoto創造以來,憑借其簡潔、靈活和強大的面向對象特性,在全球范圍內獲得了廣泛的認可。本文將深入探討Ruby的面向對象編程(OOP)特性,幫助讀者更好地理解和…

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現圍欄羊駝的檢測識別(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現圍欄羊駝的檢測識別(C#代碼,UI界面版)工業相機使用YoloV8模型實現圍欄羊駝的檢測識別工業相機通過YoloV8模型實現圍欄羊駝的檢測識別的技術背景在相機SDK中獲取圖像轉換圖像的代碼分…

如何利用 rowid 在OceanBase 中處理大表時提效

本文作者:張瑞遠,現主要從事電信級IT系統及數據庫的規劃設計、架構設計、運維實施、運維服務、故障處理、性能優化等工作,曾經從事銀行、證券數倉設計、開發、優化類工作,持有Orale OCM,MySQL OCP及國產代表數據庫認證。 獲得包括…