摘要:閱讀原文簡介是的新特性,提供了對異步編程控制的新的解決方案,在過去書寫異步代碼時要靠回調函數,當異步操作依賴于其他異步操作的返回值時,會出現一種現象,被程序員們稱為回調地獄,即多層回調函數嵌套,這種代碼的可讀性維護性都很差,因此誕生了,當然
Promise 是 ES6 的新特性,提供了對 js 異步編程控制的新的解決方案,在過去書寫異步代碼時要靠回調函數,當異步操作依賴于其他異步操作的返回值時,會出現一種現象,被程序員們稱為 “回調地獄”,即多層回調函數嵌套,這種代碼的可讀性、維護性都很差,因此誕生了 Promise,當然 Promise 并不是完全擺脫回調,而只是改變了傳遞回調的位置,大大減少了回調函數嵌套。
Promise 中的代碼默認是同步執行的,then 方法中的回調在微任務隊列中執行,在 Promise 的 then 方法中支持傳入兩個參數,一個是成功的回調,一個是失敗的回調,在 Promise 中調用了 resolve 方法,就會在 then 中執行成功的回調,調用了 reject 方法,就會在 then 中執行失敗的回調,成功的回調和失敗的回調只能執行一個,resolve 和 reject 方法調用時傳入的參數會傳遞給 then 方法中對應的回調函數。
// 執行 resolve let p = new Promise((resolve, reject) => { console.log(1); resovle(3); }); console.log(2); p.then(data => { console.log(data); }, err => { console.log(err); }); // 1 // 2 // 3
// 執行 reject let p = new Promise((resolve, reject) => { reject(); }); p.then(() => { console.log(1); }, () => { console.log(2); }); // 2
如果 Promise 中發生錯誤,就會在 then 中執行失敗的回調。
// 失敗的回調 let p = new Primise((resolve, reject) => { throw new Error(); }); p.then(() => { console.log(1); }, () => { console.log("報錯啦"); }); // 報錯啦
當同一個 Promise 實例的 then 方法多次調用時,就會多次執行。
// 多次調用 then let p = new Promise((resolve, reject) => { resolve("成功"); }); p.then(data => { console.log(data); }); p.then(data => { console.log(data); }); // 成功 // 成功2、Promise 的鏈式調用
Promise 支持鏈式調用,每次調用一次 then 方法都會返回一個新的 Promise實例,如果該 then 方法中執行的回調函數有返回值,并且這個返回值會作為返回的下一個 Promise 實例的 then 方法回調的參數,如果 then 方法的返回值是一個 Promise 實例,那就返回一個新的 Promise 實例,將 then 返回的 Promise 實例執行后的結果作為返回 Promise 實例回調的參數。
// 鏈式調用 then function read(url) { return new Promise((resolve, reject) => { fs.readFile(url, "utf8", (err, data) => { if (err) reject(err); resolve(data); }) }); } read("1.txt").then(data => { // 假設此時讀到的內容為 Hello world return data; }, err => { console.log(err); }).then(data => { console.log(data); // Hello world }, err => { console.log(err); }); read("1.txt").then(data => { // 假如此時讀到的 1.txt 的內容為 2.txt 的字符串,2.txt 的內容為 Hello world return read(data); }, err => { console.log(err); }).then(data => { console.log(data); // Hello world }, err => { console.log(err); });
在 Promise 實例的 then 中如果有錯誤產生,在返回的新的 Promise 實例中的 then 方法中會執行錯誤的回調。
// 鏈式調用 then 出錯 let p = new Promise((resolve, reject) => { resolve(); }); p.then(() => { console.log("success", 1); throw new Error(); }, () => { console.log("error", 1); }).then(() => { console.log("success", 2); }, () => { console.log("error", 2) }) // success 1 // error 2
在 Promise 中有三個狀態:
pending:等待態
fulfilled:成功態
rejected:失敗態
Promise 實例的狀態只能從 pending 到 fulfilled 或從 pending 到 rejected,狀態一旦發生變化就不可逆,所以 Promise 實現鏈式調用與 jQuery 不同,返回的不是 this,只能是一個新的 Promise。
3、實例方法 catch在 Promise 中實例的 catch 方法可以捕獲鏈式調用中的異常,不需要每次調用 then 方法中都傳入錯誤的回調,在鏈式調用的過程中只要有任何一個 then 中出現錯誤,都會被 catch 方法捕獲到。
// catch 方法 let p = new Promise((resolve, reject) => { resolve(); }); p.then(() => { throw new Error(); console.log("success", 1); }).then(() => { console.log("success", 2); }).catch(() => { console.log("出錯了"); }); // 出錯了 p.then(() => { console.log("success", 1); }).then(() => { throw new Error(); console.log("success", 2); }).catch(() => { console.log("出錯了"); }); // success 1 // 出錯了4、靜態方法 Promise.all
Promise 中的靜態方法 all 可以實現多個 Promise 實例的并行,當所有結果都為成功時,返回一個數組,該數組存儲的為每一個 Promise 實例的返回結果,每一個 Promise 實例的返回順序先后不固定,但是返回值的數組內存儲每一個 Promise 的返回值的結果按照最初傳入的順序排列,all 方法的返回值為一個新的 Promise 實例,返回的數組作為返回新 Promise 的 then 方法成功回調的參數。
當 all 傳入的參數數組中的 Promise 實例執行時,只要有一個失敗,則直接返回該 Promise 實例失敗的結果或錯誤信息。
// Promise.all 方法 let p1 = new Promise((resolve, reject) => { resolve(1); }); let p2 = new Promise((resolve, reject) => { resolve(2); }); Promise.all([p1, p2]).then(data => { console.log(data); }); // [1, 2]
// Promise.all 錯誤捕獲 let p1 = new Promise((resolve, reject) => { resolve(1); }); let p2 = new Promise((resolve, reject) => { reject(2); }); Promise.all([p1, p2]).then(data => { console.log(data); }).catch(err => { console.log(err); }); // 25、靜態方法 Promise.race
Promise 的靜態方法 race 的用法和 all 類似,參數同為一個存儲 Promise 實例的數組,返回值同樣是一個新的 Promise 的實例,不同的是,數組中的 Promise 實例只有一個結果為成功,那就直接返回這個結果(只取出最快返回的結果),在沒有成功的結果之前有一個出錯,就直接返回這個錯誤。
// Promise.race 方法 let p1 = new Promise((resolve, reject) => { setTimeout(() => resolve(1), 2000); }); let p2 = new Promise((resolve, reject) => { setTimeout(() => resolve(2), 1000); }); Promise.race([p1, p2]).then(data => { console.log(data); }).catch(err => { console.log(err); }); // 2
// Promise.race 錯誤捕獲 let p1 = new Promise((resolve, reject) => { setTimeout(() => reject(1), 1000); }); let p2 = new Promise((resolve, reject) => { setTimeout(() => resolve(2), 2000); }); Promise.race([p1, p2]).then(data => { console.log(data); }).catch(err => { console.log(err); }); // 16、靜態方法 Promise.resolve
Promise 的靜態方法 resolve 可以直接將 Promise 的狀態變為成功并返回一個新的 Promise 實例,resolve 的參數會傳遞給返回的新 Promise 實例 then 中成功回調。
// Promise.resolve 方法 Promise.resolve("hello").then(data => { console.log(data); }); // hello7、靜態方法 Promise.reject
Promise 的靜態方法 reject 與 resolve 使用完全相同,都返回一個新的 Promise 實例,不同的是 reject 的參數會傳遞給新 Promise 實例的 then 方法失敗回調。
// Promise.reject 方法 Promise.reject("出錯了").then(null, err => { console.log(err); }); // 出錯了
當成功的回調不傳遞時,可以使用 null 代替,因為 null 作為參數會被忽略掉,將參數穿透到下一個 then 的回調中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98282.html
摘要:簡介指的是兩個關鍵字,是引入的新標準,關鍵字用于聲明函數,關鍵字用來等待異步必須是操作,說白了就是的語法糖。最后希望大家在讀過異步發展流程這個系列之后,對異步已經有了較深的認識,并可以在不同情況下游刃有余的使用這些處理異步的編程手段。 showImg(https://segmentfault.com/img/remote/1460000018998406?w=1024&h=379); ...
摘要:遍歷器原有的表示集合的數據結構,主要有和,在中又加入了和,這樣就有了四種數據集合,還可以組合使用它們,如數組的成員是或,這樣就需要一種統一的接口機制,用來處理所有不同的數據結構。 showImg(https://segmentfault.com/img/remote/1460000018998438?w=900&h=431); 閱讀原文 Generators 簡介 Generato...
摘要:今天來學習下吧其實這在筆試上也是一個考點基本介紹對象是熟悉的名字吧工作組提出的規范原本只是社區提出的構想一些外部函數庫率先實現了該功能中將其寫入了語言標準目的為異步操作提供統一接口是啥它就是一個中一個對象起著代理作用充當異步操作與回調函 今天來學習下Promise吧,其實這在筆試上也是一個考點. 基本介紹 Promise對象是CommonJS(熟悉的名字吧- -)工作組提出的規范.Pr...
摘要:構造函數的實現我們在使用的時候其實是使用關鍵字創建了一個的實例,其實是一個類,即構造函數,下面來實現構造函數。 showImg(https://segmentfault.com/img/remote/1460000018998456); 閱讀原文 概述 Promise 是 js 異步編程的一種解決方案,避免了 回調地獄 給編程帶來的麻煩,在 ES6 中成為了標準,這篇文章重點不是敘...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規范并可配合使用的寫一個符合規范并可配合使用的理解的工作原理采用回調函數來處理異步編程。 JavaScript怎么使用循環代替(異步)遞歸 問題描述 在開發過程中,遇到一個需求:在系統初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...
閱讀 2089·2021-11-02 14:48
閱讀 2765·2019-08-30 14:19
閱讀 2935·2019-08-30 13:19
閱讀 1303·2019-08-29 16:17
閱讀 3239·2019-08-26 14:05
閱讀 2994·2019-08-26 13:58
閱讀 3082·2019-08-23 18:10
閱讀 1110·2019-08-23 18:04