摘要:的狀態對象有三種狀態初始狀態,既不是也不是成功。創建的基本語法使用來調用的構造器進行實例化注意時,會立即執行。等同于以下形式報錯注意要想調用之后返回的對象的不是,必須一個值和返回對象的狀態是,而不是
1 Promise的狀態
1.1 Promise對象有三種狀態:
pending 初始狀態,既不是resolved也不是rejected;
resolved 成功。此時調用onFulfilled;
rejected 失敗。此時調用onRejected;
resolved和rejected都可以表示為settled.最初Promise為pending狀態,在執行后轉為settled狀態,而settled狀態分為兩種:在成功后轉為resolved,執行.then(onFulfilled)方法;在失敗后轉為reject,執行.then(onRejected)或.catch(onRejected),進行異步操作,再返回Promise對象。
2 創建Promise的基本語法:
2.1 使用new來調用Promise的構造器進行實例化
var promise = new Promise(function(resolve, reject) { if(...) { resolve(data); } else { reject(new Error("error")); } }); 注意:new Promise(func)時,func會立即執行。 e.g.1 new Promise(function(resolve, reject) { console.log("#1"); resolve(1);//執行完這行,內部屬性[[PromiseStatus]]和[[PromiseValue]]都變了,分別由pending -> resolved, undefined -> 1 console.log("#2"); }).then(function() { console.log("#3"); }); // #1 #2 #3 先執行主線程執行棧中的代碼 e.g.2 new Promise(function(resolve, reject) { console.log("#1"); reject(4);//執行完這行,內部屬性[[PromiseStatus]]和[[PromiseValue]]都變了,分別由pending -> rejected, undefined -> 4 console.log("#2"); }); // #1 #2 報錯:Uncaught (in promise) Error: reject(…) 因為后面沒有then/catch提供的onRejected回調,異常沒有被消費掉 P.S. reject的參數可以是任意類型的,但一般都傳入 Error對象表示錯誤原因
2.2 Promise.resolve & Promise.reject
Promise.resolve & Promise.reject可以認為是new Promise()的快捷方式,返回值也是一個promise對象,所以可以進行鏈式調用。
Promise.resolve(4); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 4} 等同于以下代碼 new Promise(function(resolve) { resolve(4); }); Promise.reject(4); // Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 4} //等同于以下代碼 new Promise(function(resolve, reject) { reject(4); })
3 Promise.prototype.then(function onFulfilled() {...}, function onRejected() {...})
當resolve(成功)時,會調用onFulfilled函數;reject(失敗)時,會調用onRejected函數。若只想處理異常情況的函數,可promise.then(undefined, onRejected),當然更好的選擇是用promise.catch()來處理。二者效果相同。
promise.then(function (value) { console.log(value); }).catch(function (error) { console.log(error); }); //等同于以下形式 promise.then(function (value) { console.log(value); }, function (error) { console.log(error); }); e.g.3 new Promise(function(resolve, reject) { resolve(2); }); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 2} e.g.4 new Promise(function(resolve, reject) { resolve(2); }).then(function() { console.log("ha"); }); // ha Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined} e.g.5 new Promise(function(resolve, reject) { resolve(2); }).then(function() { return "haha"; }); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "haha"} e.g.6 new Promise(function(resolve, reject) { reject(2); }); // Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 2} 報錯:Uncaught (in promise) 2 e.g.7 new Promise(function(resolve, reject) { reject(2); }).then(function() { }, function() { console.log("ha"); }); // ha Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined} e.g.8 new Promise(function(resolve, reject) { reject(2); }).then(function() { }, function() { return "haha"; }); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "haha"} 注意:要想調用then之后返回的promise對象的[[PromiseValue]]不是undefined,必須return一個值; e.g.7和e.g.8返回對象的狀態是 resolved,而不是 rejected.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94537.html
摘要:的幾個擴展總結描述和相反,當所有的被拒絕之后,方法執行完成的決議,如果存在一個執行完成的決議,方法則執行拒絕里邊的所有實例反過來就好了執行到此執行到此描述忽略被拒絕的,只需要有一個完成的,方法就執行完成操作,如果全部的都被拒絕,方法執行拒絕 Promise的幾個擴展API總結 1. Promise.none 描述: 和 Promise.all 相反,當所有的promise被拒絕之后,n...
摘要:構造函數的實現我們在使用的時候其實是使用關鍵字創建了一個的實例,其實是一個類,即構造函數,下面來實現構造函數。 showImg(https://segmentfault.com/img/remote/1460000018998456); 閱讀原文 概述 Promise 是 js 異步編程的一種解決方案,避免了 回調地獄 給編程帶來的麻煩,在 ES6 中成為了標準,這篇文章重點不是敘...
摘要:使用對象的好處在于可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。對象異步操作拋出錯誤,狀態就會變為,就會調用方法指定的回調函數處理這個錯誤。 Promise 含義 Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了 Promise 對象。 所謂 P...
摘要:對于的來說基元函數包括組合函數的類型簽名返回情況完成如果傳入的可迭代對象為空,會同步地返回一個已完成狀態的。相反,如果是在指定的時間之后完成,剛返回結果就是一個拒絕狀態的從而觸發方法指定的回調函數。在行中,對每個小任務得到的結果進行匯總。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 從ES6 開始,我們大都使用的是 P...
摘要:寫在前面這一章的順序對于未接觸過使用過的童鞋而言略抽象了,前邊幾章主要為了說明和之前的異步方式相比有什么優勢和它能解決什么問題,后邊才詳解的設計和各種場景下如何使用。建議先了解和簡單使用過后再閱讀,效果更佳。 寫在前面:Promise這一章的順序對于未接觸過使用過Promise的童鞋而言略抽象了,前邊幾章主要為了說明Promise和之前的異步方式相比有什么優勢和它能解決什么問題,后邊才...
閱讀 2591·2021-09-26 10:17
閱讀 3221·2021-09-22 15:16
閱讀 2131·2021-09-03 10:43
閱讀 3258·2019-08-30 11:23
閱讀 3658·2019-08-29 13:23
閱讀 1301·2019-08-29 11:31
閱讀 3686·2019-08-26 13:52
閱讀 1394·2019-08-26 12:22