中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

js中Promise是什么

發布時間:2022-03-24 14:56:20 來源:億速云 閱讀:159 作者:小新 欄目:web開發

這篇文章主要為大家展示了“js中Promise是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“js中Promise是什么”這篇文章吧。

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是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邮箱| 秦皇岛市| 龙泉市| 左云县| 华蓥市| 淮阳县| 西丰县| 康定县| 北辰区| 房山区| 留坝县| 五常市| 军事| 博客| 修武县| 嫩江县| 沁水县| 沧源| 田阳县| 惠东县| 通辽市| 会昌县| 彭阳县| 阳新县| 冀州市| 永登县| 尚义县| 武义县| 会泽县| 福贡县| 旬阳县| 遂溪县| 三原县| 台江县| 忻州市| 深泽县| 霍林郭勒市| 紫阳县| 剑河县| 茌平县| 喀喇沁旗|