Promise詳解:Promise解決ajax回調嵌套問題

目錄

一、Promise是什么

二、回調地獄

三、Promise解決回調地獄的原理

四、promaise實例


一、Promise是什么

1、主要用于異步計算

2、可以將異步操作隊列化,按照期望的順序執行,返回符合預期的結果

4、可以在對象之間傳遞和操作promise,幫助我們處理隊列

二、回調地獄

當一個回調函數嵌套一個回調函數的時候,就會出現一個嵌套結構,當嵌套的多了就會出現回調地獄的情況, 比如我們發送三個 ajax 請求,第一個正常發送,第二個請求需要第一個請求的結果中的某一個值作為參數,第三個請求需要第二個請求的結果中的某一個值作為參數,回調地獄,其實就是回調函數嵌套過多導致的。

ajax({url: '我是第一個請求',success (res) {// 現在發送第二個請求ajax({url: '我是第二個請求',data: { a: res.a, b: res.b },success (res2) {// 進行第三個請求ajax({url: '我是第三個請求',data: { a: res2.a, b: res2.b },success (res3) {console.log(res3) ;// ...}})}})}})

三、Promise解決回調地獄的原理

下面就帶大家創建一個Promise對象

let p1 = new Promise(function (resolve, reject) {// 此處執行異步的代碼setTimeout(()=>{// 我們可以根據自己的標準在異步任務完成的時候// 選擇是執行失敗的回調函數還是成功的回調函數// 第一個形參resolve 表示成功的回調resolve('300')// 第二個形參reject 表示失敗的回調},3000)
})// 定義當p1這個promise對象變成成功狀態的時候要執行的回調函數
p1.then((data)=>{console.log("我是成功的時候執行的函數")console.log("我執行的時候你給我傳入的參數",data)
})// 定義當p1這個promise對象變成失敗狀態的時候要執行的回調函數
p1.catch((err)=>{console.log("我是失敗的時候執行的函數")console.log("我執行的時候你給我傳入的參數",err)
})

resolve作用是,將Promise對象的狀態從“未完成”變為“成功”(即從 pending 變為 resolved),在異步操作成功時調用,并將異步操作的結果,作為參數傳遞出去;

reject作用是,將Promise對象的狀態從“未完成”變為“失敗”(即從 pending 變為 rejected),在異步操作失敗時調用,并將異步操作報出的錯誤,作為參數傳遞出去。

Promise是一個對象,這個對象有三個狀態:

待定(pending):初始狀態,既沒有成功,也沒有失敗,表示異步任務正在進行中

成功(fulfilled):異步任務執行完畢,變成成功狀態

失敗(rejected):異步任務執行完畢,變成失敗狀態

當promise狀態發生改變,就會觸發then()里的響應函數處理后續步驟;

promise狀態一經改變,不會再變

Promise對象的狀態改變,只有兩種可能:

從pending變為fulfilled

從pending變為rejected

Promise對象這樣就創建好了,下面來解決ajax回調地獄問題。

四、promaise實例

傳統寫法

const fs = require("fs")
fs.readFile("./one.txt", (err, data1) => {fs.readFile("./two.txt", (err, data2) => {fs.readFile("./three.txt", (err, data3) => {console.log(data1 + "\n" + data2 + "\n" + data3)})})
})

Promise寫法

const fs = require("fs")const p = new Promise((resolve, reject) => {fs.readFile("./one.txt", (err, data) => {resolve(data)})
})
p.then(value => {return new Promise((resolve, reject) => {fs.readFile("./two.txt", (err, data) => {resolve([value, data])})})
}).then(value => {return new Promise((resolve, reject) => {fs.readFile("./three.txt", (err, data) => {value.push(data)resolve(value)})})
}).then(value => {let str = value.join("\n")console.log(str)
})

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

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

相關文章

【Kubernetes知識點】Pod調度和ConfigMaps

目錄 1.如何將特定Pod調度到指定的節點? 2.什么是節點的親和性? 3.什么是污點,它的主要用途是什么? 4.解釋ConfigMap的作用。 5.Secret和ConfigMap相比較有哪些優點。 6.解釋ResourceQuota的作用 1.如何將特定Pod調度到指定…

火車頭使用Post方法采集Ajax頁面教程

前面有寫過一篇瀑布流的采集方法,今天在添加一個POST方法來采集Ajax刷新頁面的教程。 之前的文章請看:火車頭采集動態加載Ajax數據(無分頁瀑布流網站) 如果遇到POST方法來架子Ajax數據,這和我之前寫的是兩個類型&…

【學習記錄】structuredClone,URLSearchParams,groupBy

structuredClone() 可以進行深拷貝,這里有詳細講解:Window:structuredClone() 方法 當需要處理包含嵌套對象或數組的復雜數據結構時,建議使用 structuredClone() 來保護原始數據。 舉例:別再用 … 擴展運算符了&#x…

30條AI編程指令

大家好,小機又來分享AI了。 前言: 凌晨三點,你還在像素級對齊那個永遠對不齊的按鈕;剛寫完的API文檔,產品經理一句"需求變了" 讓你瞬間崩潰;更扎心的是,實習生用AI十分鐘搞定了你要…

AI+虛擬仿真:以科技之光照亮希望的田野

在鄉村振興與農業現代化的全新征程中,農林專業人才肩負著科技賦能土地、守護綠色發展的重任。然而,現有的教育模式卻越發不適應農業人才的培養需求。“AI虛擬仿真”正在為農業現代化人才建設提供創新的技術引擎。市場風口與政策紅據統計,2024…

04_函數

第4課:函數 課程目標 掌握函數的定義和調用方法學習參數傳遞和返回值的使用理解函數的作用域和命名空間 1. 函數的基本概念 函數是一段可重復使用的代碼塊,用于執行特定的任務。 2. 函數的定義和調用 # 定義函數 def greet():print("你好&#xff0…

STM32學習筆記19-FLASH

FLASH簡介STM32F1系列的FLASH包含程序存儲器、系統存儲器和選項字節三個部分,通過閃存存儲器接口(外設)可以對程序存儲器和選項字節進行擦除和編程,讀取指定寄存器直接使用指針讀即可讀寫FLASH的用途:利用程序存儲器的…

電蚊拍的原理及電壓電容參數深度解析:從高頻振蕩到倍壓整流的完整技術剖析

1. 引言在炎炎夏日,蚊蟲成為人們生活中的一大困擾。電蚊拍作為一種高效、環保的物理滅蚊工具,憑借其便攜性和實用性在全球范圍內得到了廣泛應用。然而,許多用戶對這種看似簡單的小家電背后的工作原理知之甚少。電蚊拍是一種新型的滅蚊小家電&…

Mac簡單測試硬盤讀寫速度

一、下載軟件 Blackmagic Disk Speed Test 「達芬奇 磁盤速度測試」二、選中測試位置可以隨便選個文件比如“下載”目錄三、開始測速

? 零 ? ? 安全體系構建內容結構

👍點「贊」📌收「藏」👀關「注」💬評「論」在金融科技深度融合的背景下,信息安全已從單純的技術攻防擴展至架構、合規、流程與創新的系統工程。作為一名從業十多年的老兵,系統闡述數字銀行安全體系的建設路…

XP系統安裝Android Studio 3.5.3并建立Java或Native C++工程,然后在安卓手機上運行

第一節 安裝Android Studio 3.5.3Android Studio 3.5.3下載地址:Android Studio 3.5.3 December 5, 2019 Windows (32-bit): android-studio-ide-191.6010548-windows32.zip (756.1 MB) https://redirector.gvt1.com/edgedl/android/studio/ide-zips/3.5.3.0/androi…

calchash.exe和chckhash.exe計算pe文件hash值的兩個實用小工具

第一部分: C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\NT5.CAT t部分內容B B D 0 2 2 2 1 A A 6 5 5 6 2 8 F 4 9 5 F 6 C D 3 0 3 9 0 8 B B E 0 0 F 9 5 9 5 第二部分: D:\>calchash.exe pidgen.dll BB D0 22 21 AA 65 …

lanczso算法中的額外正交化代碼解釋

額外正交化 定義:在Lanczos算法中,由于浮點誤差,生成的向量可能不完全正交,需要額外正交化步驟。代碼實現:def extra_orthogonalization(v, basis):for u in basis:v - u * (v.dot(u) / u.dot(u))

Rabbit 實戰指南-學習筆記

第 4 章 RabbitMQ 進階 mandatory 參數 Returning | RabbitMQ 當 mandatory 參數設為 true 時,交換器無法根據自身的類型和路由鍵找到一個符合條件的隊列,那么RabbitMQ 會調用 Basic.Return 命令將消息返回給生產者,通過調用channel.addReturnListener …

BEVDet4D

1. BEVDet4D算法動機及開創性思路 1)BEVDet算法概述輸入輸出:輸入為6視角圖像(NuScenes數據集),輸出為3D檢測結果核心模塊: 圖像編碼器:由Backbone網絡和多尺度特征融合網絡組成,處理…

當 AI 學會 “理解” 人類:自然語言處理的進化與倫理邊界

大家可以去我的資源看看,有很多關于AI的免費資源可以下載,不下載也可以看看,真的對你有用引言:從 “對話” 到 “理解”——AI 語言能力的時代躍遷現實錨點:以日常場景切入(如 ChatGPT 流暢回應復雜問題、A…

WPF控件隨窗體大寬度高度改變而改變

前臺控件中:Width"{Binding RelativeSource{RelativeSource AncestorTypeWindow}, PathWidth}"后臺代碼:定義在加載事件里面this.SizeChanged ProductData_SizeChanged;private void ProductData_SizeChanged(object sender, SizeChangedEven…

E10 通過RPC實現賬號批量鎖定與解鎖

需求背景:賬號信息由三方系統管理,包含賬號狀態,所以需要通過提供給三方的 Rest 接口中,實現賬號鎖定與解鎖。參考基線版本:10.0.2506.01,過低的版本可能無法使用。 鎖定分為兩種: (…

什么是AI寵物

什么是AI寵物AI寵物是由AI大腦驅動的生命體AI產品。它能主動產生情緒和意圖,并通過情緒和意圖去驅動自己的動作和行為。它根據自己的意愿和用戶互動,不受用戶控制。從一定意義上講,它擁有了人工生命和自由意志。它有自己的行為邏輯&#xff0…

簡單AI:搜狐公司旗下AI繪畫產品

本文轉載自:簡單AI:搜狐公司旗下AI繪畫產品 - Hello123工具導航 ** 一、平臺定位與技術特性 搜狐簡單 AI 是搜狐推出的多模態 AI 創作平臺,基于自研大模型提供文生圖、文生文等能力。它專注于零門檻內容生成,用戶無需專業技能即…