中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

javascript Promise簡單學習使用方法小結
來源:易賢網(wǎng) 閱讀:1030 次 日期:2016-06-27 16:05:20
溫馨提示:易賢網(wǎng)小編為您整理了“javascript Promise簡單學習使用方法小結”,方便廣大網(wǎng)友查閱!

下面小編就為大家?guī)硪黄猨avascript Promise簡單學習使用方法小結。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。

解決回調(diào)函數(shù)嵌套太深,并行邏輯必須串行執(zhí)行,一個Promise代表一個異步操作的最終結果,跟Promise交互的主要方式是通過他的then()方法來注冊回調(diào)函數(shù),去接收Promise的最終結果值

Promise相關的協(xié)議有PromiseA和PromiseA+

定義一個類Promise

定義屬性隊列queue,初始化空數(shù)組[]

定義屬性值value,初始化null

定義屬性狀態(tài)status,初始化“pending”(默認值)

定義成員方法getQueue(),返回屬性queue

定義成員方法getStatus(),返回屬性status

定義成員方法setStatus(),設置狀態(tài),傳遞參數(shù):status,value

判斷status為fulfilled或者rejected,

設置status屬性this.status=status

設置value屬性this.value=value || null ,如果不傳value就是null

定義凍結變量freezeObject

定義成員方法isFulfilled(),判斷當前狀態(tài)是否是(完成)

定義成員方法isRejected(),判斷當前狀態(tài)是否是(失?。?/P>

定義成員方法isPending(),判斷當前狀態(tài)師傅是(等待)

定義成員方法then(),傳遞參數(shù):onFulfilled成功的回調(diào),onRejected失敗的回調(diào)

定義對象handler對象,屬性fulfilled,rejected兩個回調(diào)函數(shù)

定義handler對象的deferred屬性,Deferred對象

判斷當前狀態(tài)是否等待,如果是等待 把handler對象塞入queue隊列數(shù)組

如果不是等待狀態(tài),調(diào)用Utils對象的procedure()方法,參數(shù):status,

返回 handler.deferred.promise對象

定義一個類Deferred

定義屬性promise,初始化Promise對象

定義成員方法resolve(),傳遞參數(shù):result結果

判斷Promise對象的狀態(tài)是 等待,直接返回

調(diào)用Promise對象的getQueue()方法,獲取queue數(shù)組

循環(huán)數(shù)組

//todo調(diào)用工具類Utils. procedure()方法,參數(shù):“fulfilled”,元素,err信息

調(diào)用Promise對象的setStatus()方法,設置狀態(tài),參數(shù):'fulfilled',result

定義成員方法reject,傳遞參數(shù):err錯誤信息

判斷Promise對象的狀態(tài)是 等待,直接返回

調(diào)用Promise對象的getQueue()方法,獲取queue數(shù)組

循環(huán)數(shù)組

//todo,調(diào)用工具類Utils. procedure()方法,參數(shù):“rejected”,元素,err信息

調(diào)用Promise對象的setStatus()方法,設置狀態(tài),參數(shù):'fulfilled',result

定義工具類Utils,使用匿名函數(shù)立即執(zhí)行,得到一個對象

返回對象,對象中有一個方法procedure()

定義procedure()方法,傳遞參數(shù):type狀態(tài)類型,handler處理器數(shù)組,result結果

獲取到處理函數(shù)func,在handler[type]

到這里我看暈了。。。

使用方法:

定義一個函數(shù)ajax,傳遞參數(shù):url路徑

獲取Deferred對象,new出來

ajax請求數(shù)據(jù)的代碼,在返回數(shù)據(jù)的回調(diào)方法中

如果成功了調(diào)用Deferred對象的resolve()方法,參數(shù):返回的數(shù)據(jù)

如果失敗了調(diào)用Deferred對象的reject()方法,參數(shù):返回的數(shù)據(jù)

返回Deferred.promise對象

調(diào)用ajax()方法,得到promise對象,參數(shù):url,

調(diào)用promise對象的then()方法,參數(shù):匿名函數(shù)

調(diào)用ajax()方法,獲取到promise對象,返回這個對象

形成鏈式調(diào)用

js部分:

<script>

//Promise代碼部分(我選擇狗帶)

Promise = function() {

  this.queue = [];

  this.value = null;

  this.status = 'pending';// pending fulfilled rejected

};

Promise.prototype.getQueue = function() {

  return this.queue;

};

Promise.prototype.getStatus = function() {

  return this.status;

};

Promise.prototype.setStatus = function(s, value) {

  if (s === 'fulfilled' || s === 'rejected') {

    this.status = s;

    this.value = value || null;

    this.queue = [];

    var freezeObject = Object.freeze || function(){};

    freezeObject(this);// promise的狀態(tài)是不可逆的

  } else {

    throw new Error({

      message: "doesn't support status: " + s

    });

  }

};

Promise.prototype.isFulfilled = function() {

  return this.status === 'fulfilled';

};

Promise.prototype.isRejected = function() {

  return this.status === 'rejected';

}

Promise.prototype.isPending = function() {

  return this.status === 'pending';

}

Promise.prototype.then = function(onFulfilled, onRejected) {

  var handler = {

    'fulfilled': onFulfilled,

    'rejected': onRejected

  };

  handler.deferred = new Deferred();

  if (!this.isPending()) {//這里允許先改變promise狀態(tài)后添加回調(diào)

    utils.procedure(this.status, handler, this.value);

  } else {

    this.queue.push(handler);//then may be called multiple times on the same promise;規(guī)范2.2.6

  }

  return handler.deferred.promise;//then must return a promise;規(guī)范2.2.7

};

var utils = (function(){

  var makeSignaler = function(deferred, type) {

    return function(result) {

      transition(deferred, type, result);

    }

  };

  var procedure = function(type, handler, result) {

    var func = handler[type];

    var def = handler.deferred;

    if (func) {

      try {

        var newResult = func(result);

        if (newResult && typeof newResult.then === 'function') {//thenable

          // 此種寫法存在閉包容易造成內(nèi)存泄露,我們通過高階函數(shù)解決

          // newResult.then(function(data) {

          //   def.resolve(data);

          // }, function(err) {

          //   def.reject(err);

          // });

          //PromiseA+規(guī)范,x代表newResult,promise代表def.promise

          //If x is a promise, adopt its state [3.4]:

          //If x is pending, promise must remain pending until x is fulfilled or rejected.

          //If/when x is fulfilled, fulfill promise with the same value.

          //If/when x is rejected, reject promise with the same reason.

          newResult.then(makeSignaler(def, 'fulfilled'), makeSignaler(def, 'rejected'));//此處的本質(zhì)是利用了異步閉包

        } else {

          transition(def, type, newResult);

        }

      } catch(err) {

        transition(def, 'rejected', err);

      }

    } else {

      transition(def, type, result);

    }

  };

  var transition = function(deferred, type, result) {

    if (type === 'fulfilled') {

      deferred.resolve(result);

    } else if (type === 'rejected') {

      deferred.reject(result);

    } else if (type !== 'pending') {

      throw new Error({

        'message': "doesn't support type: " + type

      });

    }

  };

  return {

    'procedure': procedure

  }

})();

Deferred = function() {

  this.promise = new Promise();

};

Deferred.prototype.resolve = function(result) {

  if (!this.promise.isPending()) {

    return;

  }

  var queue = this.promise.getQueue();

  for (var i = 0, len = queue.length; i < len; i++) {

    utils.procedure('fulfilled', queue[i], result);

  }

  this.promise.setStatus('fulfilled', result);

};

Deferred.prototype.reject = function(err) {

  if (!this.promise.isPending()) {

    return;

  }

  var queue = this.promise.getQueue();

  for (var i = 0, len = queue.length; i < len; i++) {

    utils.procedure('rejected', queue[i], err);

  }

  this.promise.setStatus('rejected', err);

}

/*****************************上面看不懂,分割線************************************/

//測試部分

ajax = function(url) {

  var def = new Deferred();

  var xhr = new XMLHttpRequest();

  xhr.onreadystatechange = function() {

    if (xhr.readyState === 4) {

      if ((xhr.status >=200 && xhr.status < 300) || xhr.status === 304) {

        def.resolve(xhr.responseText)

      } else {//簡化ajax,沒有提供錯誤回調(diào)

        def.reject(new Error({

          message: xhr.status

        }));

      }

    }

  };

  xhr.open('get', url, true);

  xhr.send(null);

  return def.promise;

}

ajax('test.php?act=1').then(function(data1) {

  console.log(data1);//處理data1

  return ajax('test.php?act=2');

}).then(function(data2) {

  console.log(data2);//處理data2

  return ajax('test.php?act=3');

}, function(err) {

  console.error(err);

}).then(function(data3) {

  console.log(data3);

  alert('success');

}, function(err) {

  console.error(err);

});

</script>

php:

<?php

if($_GET['act']==1){

  echo json_encode(array("code"=>200));

}else if($_GET['act']==2){

  echo json_encode(array("code"=>300));

}else if($_GET['act']==3){

  echo json_encode(array("code"=>400));

}

名單

以上這篇javascript Promise簡單學習使用方法小結就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考

更多信息請查看網(wǎng)絡編程
易賢網(wǎng)手機網(wǎng)站地址:javascript Promise簡單學習使用方法小結

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網(wǎng)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美激情精品久久久六区热门| 精品二区久久| 亚洲自啪免费| 在线精品国精品国产尤物884a| 国产精品高清在线| 欧美精品v日韩精品v国产精品| 久久大综合网| 久久超碰97中文字幕| 亚洲欧美在线一区| 一区二区免费在线视频| 在线播放一区| 黄色成人免费网站| 国产一区二区精品久久99| 国产精品久久久久aaaa| 国产精品www网站| 欧美午夜精品久久久久免费视| 欧美jizzhd精品欧美喷水| 久久久久国产精品一区二区| 久久久精品免费视频| 久久视频一区二区| 老司机免费视频一区二区| 久久五月婷婷丁香社区| 欧美成人免费在线观看| 欧美金8天国| 国产欧美日韩亚洲一区二区三区| 欧美日韩成人一区二区三区| 国产精品久久久久久久久| 久久xxxx精品视频| 亚洲二区三区四区| 欧美一区视频在线| 欧美日韩在线亚洲一区蜜芽| 亚洲第一中文字幕| 久久爱91午夜羞羞| 亚洲日本中文| 国产专区精品视频| 另类天堂视频在线观看| 久久久五月天| 亚洲女女女同性video| 久久天天躁狠狠躁夜夜爽蜜月| 久久久久久999| 久久精品中文| 欧美先锋影音| 欧美专区中文字幕| 国产一区欧美日韩| 久久亚洲春色中文字幕| 国产一在线精品一区在线观看| 久久青青草原一区二区| 亚洲系列中文字幕| 亚洲人在线视频| 国产欧美69| 久久久久久久久久看片| 国产亚洲欧美日韩一区二区| 欧美在线观看网址综合| 久久久噜噜噜久久| 欧美日韩第一区日日骚| 国产午夜精品一区二区三区视频 | 国产日韩欧美一区二区三区在线观看 | 亚洲欧美国产日韩中文字幕| 久久先锋影音| 国产精品护士白丝一区av| 伊人久久婷婷| 午夜精品久久久久久久99热浪潮| 久久久噜噜噜久久| 国产精品男gay被猛男狂揉视频| 亚洲高清免费视频| 久久精品成人欧美大片古装| 欧美性生交xxxxx久久久| 亚洲电影免费在线观看| 欧美一区二区免费观在线| 欧美日韩欧美一区二区| 亚洲高清久久| 欧美影院精品一区| 国产精品久久久久久久久搜平片| 亚洲日本中文字幕免费在线不卡| 欧美在线日韩在线| 欧美日韩一区二区在线观看视频 | 伊人影院久久| 午夜精品久久久久久久蜜桃app | 中文精品视频一区二区在线观看| 久久裸体艺术| 黄色成人在线观看| 欧美在线视频播放| 国产精品久久久久影院色老大| 亚洲免费久久| 欧美精品少妇一区二区三区| 亚洲国内欧美| 欧美风情在线| 亚洲精品一区二区三区在线观看| 男男成人高潮片免费网站| 亚洲第一天堂无码专区| 欧美不卡视频一区| 亚洲精品国产精品国自产观看浪潮 | 99re66热这里只有精品3直播| 午夜精品福利在线| 国产精品乱人伦中文| 亚洲韩国青草视频| 麻豆精品在线播放| 亚洲人成精品久久久久| 欧美日韩美女在线| 亚洲欧美大片| 国产一区二区三区在线播放免费观看 | 国产日韩欧美麻豆| 欧美自拍偷拍| 狠狠干成人综合网| 卡通动漫国产精品| 亚洲九九爱视频| 欧美性猛交xxxx免费看久久久| 亚洲美女视频网| 欧美午夜电影一区| 亚洲伊人第一页| 国产一区二区在线观看免费播放 | 欧美精品一区二区三区在线播放 | 欧美亚日韩国产aⅴ精品中极品| 一区二区三区日韩| 国产精品日韩精品欧美精品| 欧美一二区视频| 在线观看日韩av先锋影音电影院| 牛牛国产精品| 一本久道久久综合中文字幕| 国产精品亚洲一区| 久久福利视频导航| 亚洲激情偷拍| 国产精品普通话对白| 久久看片网站| 亚洲女人天堂成人av在线| 激情综合在线| 国产精品国产三级国产专区53| 久久九九热re6这里有精品| 亚洲黄色影院| 国产日韩欧美在线播放不卡| 欧美777四色影视在线| 亚洲免费在线视频| 亚洲国产美国国产综合一区二区| 国产精品日韩电影| 欧美成人精品福利| 欧美在线免费看| 亚洲视频一二区| 亚洲国产成人在线播放| 国产精品尤物| 欧美日韩日韩| 免费一级欧美在线大片| 午夜精品一区二区在线观看 | 亚洲在线中文字幕| 亚洲第一页在线| 国产日韩欧美在线视频观看| 欧美日韩精品中文字幕| 久久免费国产| 香蕉国产精品偷在线观看不卡| 亚洲日本久久| 在线观看日韩| 激情久久一区| 国产日韩亚洲欧美| 欧美日韩mv| 狼狼综合久久久久综合网 | 99精品久久| 亚洲电影在线观看| 国产一二精品视频| 欧美日韩在线不卡一区| 欧美大片免费| 久久综合国产精品| 欧美一区在线视频| 亚洲欧美在线磁力| 亚洲一区二区三区三| 日韩一级视频免费观看在线| 亚洲电影中文字幕| 黄色一区二区三区四区| 国产视频一区三区| 国产乱码精品| 国产欧美一区二区精品性| 国产精品国产三级国产普通话99 | 日韩视频三区| 亚洲日本中文字幕区| 亚洲人成毛片在线播放| 亚洲国产精彩中文乱码av在线播放| 禁断一区二区三区在线| 国产亚洲美州欧州综合国| 国产欧美精品日韩区二区麻豆天美| 国产精品推荐精品| 国产欧美在线观看一区| 国产一区二区三区av电影| 国内精品久久久久久久影视麻豆| 国产一区美女| 亚洲国产另类久久精品| 亚洲精品免费电影| 日韩一级片网址| 亚洲特级毛片| 欧美一区二区成人6969| 久久久久天天天天| 欧美va亚洲va日韩∨a综合色| 欧美高清视频在线| 国产一区视频在线观看免费| 国产精品网站在线| 国产午夜精品一区理论片飘花| 国产又爽又黄的激情精品视频| 狠狠入ady亚洲精品| 亚洲国产精品一区二区第一页| 亚洲欧洲精品一区二区三区不卡| 日韩视频一区二区在线观看 | 国产精品素人视频| 国产视频久久|