您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“js中Promise是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“js中Promise是什么”這篇文章吧。
Promise,翻譯過來是承諾,承諾它過一段時間會給你一個結果。從編程講Promise 是異步編程的一種解決方案。下面是Promise在MDN的相關說明:
Promise 對象是一個代理對象(代理一個值),被代理的值在Promise對象創建時可能是未知的。它允許你為異步操作的成功和失敗分別綁定相應的處理方法(handlers)。 這讓異步方法可以像同步方法那樣返回值,但并不是立即返回最終執行結果,而是一個能代表未來出現的結果的promise對象。
一個 Promise有以下幾種狀態:
pending: 初始狀態,既不是成功,也不是失敗狀態。
fulfilled: 意味著操作成功完成。
rejected: 意味著操作失敗。
這個承諾一旦從等待狀態變成為其他狀態就永遠不能更改狀態了,也就是說一旦狀態變為 fulfilled/rejected 后,就不能再次改變。 可能光看概念大家不理解Promise,我們舉個簡單的栗子;
假如我有個女朋友,下周一是她生日,我答應她生日給她一個驚喜,那么從現在開始這個承諾就進入等待狀態,等待下周一的到來,然后狀態改變。如果下周一我如約給了女朋友驚喜,那么這個承諾的狀態就會由pending切換為fulfilled,表示承諾成功兌現,一旦是這個結果了,就不會再有其他結果,即狀態不會在發生改變;反之如果當天我因為工作太忙加班,把這事給忘了,說好的驚喜沒有兌現,狀態就會由pending切換為rejected,時間不可倒流,所以狀態也不能再發生變化。
上一條我們說過Promise可以解決回調地獄的問題,沒錯,pending 狀態的 Promise 對象會觸發 fulfilled/rejected 狀態,一旦狀態改變,Promise 對象的 then 方法就會被調用;否則就會觸發 catch。我們將上一條回調地獄的代碼改寫一下:
new Promise((resolve,reject) => { setTimeout(() => { console.log(1) resolve() },1000) }).then((res) => { setTimeout(() => { console.log(2) },2000)}).then((res) => { setTimeout(() => { console.log(3) },3000)}).catch((err) => {console.log(err)})
其實Promise也是存在一些缺點的,比如無法取消 Promise,錯誤需要通過回調函數捕獲。
promise手寫實現,面試夠用版:
function myPromise(constructor){ let self=this; self.status="pending" //定義狀態改變前的初始狀態 self.value=undefined;//定義狀態為resolved的時候的狀態 self.reason=undefined;//定義狀態為rejected的時候的狀態 function resolve(value){ //兩個==="pending",保證了狀態的改變是不可逆的 if(self.status==="pending"){ self.value=value; self.status="resolved"; } } function reject(reason){ //兩個==="pending",保證了狀態的改變是不可逆的 if(self.status==="pending"){ self.reason=reason; self.status="rejected"; } } //捕獲構造異常 try{ constructor(resolve,reject); }catch(e){ reject(e); }}// 定義鏈式調用的then方法myPromise.prototype.then=function(onFullfilled,onRejected){ let self=this; switch(self.status){ case "resolved": onFullfilled(self.value); break; case "rejected": onRejected(self.reason); break; default: }}
以上是“js中Promise是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。