欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

AngularJS中的Promise詳細(xì)介紹及實(shí)例代碼

 更新時間:2016年12月13日 10:03:28   作者:yyyuuu777  
這篇文章主要介紹了AngularJS中的Promise詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,Promise是一種模式,以同步操作的流程形式來操作異步事件,避免了層層嵌套,可以鏈?zhǔn)讲僮鳟惒绞录?,需要的朋友可以參考?/div>

Angular中的Promise

在用jQuery的時候就知道 promise 是 Js異步編程模式的一種模式,但是不是很明白他跟JQuery的deferred對象有什么區(qū)別。隨著公司項(xiàng)目的進(jìn)行,要跟后臺接數(shù)據(jù)了,所以決定搞定它。

Promise

Promise是一種模式,以同步操作的流程形式來操作異步事件,避免了層層嵌套,可以鏈?zhǔn)讲僮鳟惒绞录?/p>

我們知道,在編寫JavaScript異步代碼時,callback是最最簡單的機(jī)制,可是用這種機(jī)制的話必須犧牲控制流、異常處理和函數(shù)語義化為代價,甚至?xí)屛覀兊暨M(jìn)出現(xiàn)callback大坑,而promise解決了這個問題。

ES6中Promise、AngularJS內(nèi)置的AngularJS內(nèi)置Q,以及when采用的都是Promises/A規(guī)范,如下:

每個任務(wù)都有三種狀態(tài):未完成(pending)、完成(fulfilled)、失敗(rejected)。

  • pending狀態(tài):可以過渡到履行或拒絕狀態(tài)。
  • fulfilled狀態(tài):不能變?yōu)槠渌魏螤顟B(tài),而且狀態(tài)不能改變,必須有value值。
  • rejected狀態(tài):不能變?yōu)槠渌魏螤顟B(tài),而且狀態(tài)不能改變,必須有reason。

狀態(tài)的轉(zhuǎn)移是一次性的,狀態(tài)一旦變成fulfilled(已完成)或者failed(失敗/拒絕),就不能再變了。

function okToGreet(name){
  return name === 'Robin Hood';
}

function asyncGreet(name) {
  var deferred = $q.defer();

  setTimeout(function() {
   // 因?yàn)檫@個異步函數(shù)fn在未來的異步執(zhí)行,我們把代碼包裝到 $apply 調(diào)用中,一邊正確的觀察到 model 的改變
    $scope.$apply(function() {
      deferred.notify('About to greet ' + name + '.');

      if (okToGreet(name)) {
        deferred.resolve('Hello, ' + name + '!');
      } else {
        deferred.reject('Greeting ' + name + ' is not allowed.');
      }
    });
  }, 1000);

  return deferred.promise;
}

var promise = asyncGreet('Robin Hood');
promise.then(function(greeting) {
  alert('Success: ' + greeting);
}, function(reason) {
  alert('Failed: ' + reason);
}, function(update) {
  alert('Got notification: ' + update);
});

  Q Promise的基本用法

上面代碼表示, $q.defer() 構(gòu)建的 deffered 實(shí)例的幾個方法的作用。如果異步操作成功,則用resolve方法將Promise對象的狀態(tài)變?yōu)椤俺晒Α保磸膒ending變?yōu)閞esolved);如果異步操作失敗,則用reject方法將狀態(tài)變?yōu)椤笆 保磸膒ending變?yōu)閞ejected)。最后返回 deferred.promise ,我們就可以鏈?zhǔn)秸{(diào)用then方法。

JS將要有原生Promise,ES6中已經(jīng)有Promise對象,firefox和Chrome 32 beta版本已經(jīng)實(shí)現(xiàn)了基本的Promise API

AngularJs中的$q.defferd

通過 調(diào)用 $q.defferd 返回deffered對象以鏈?zhǔn)秸{(diào)用。該對象將Promises/A規(guī)范中的三個任務(wù)狀態(tài)通過API關(guān)聯(lián)。

deffered API

deffered 對象的方法

  • resolve(value):在聲明resolve()處,表明promise對象由pending狀態(tài)轉(zhuǎn)變?yōu)閞esolve。
  • reject(reason):在聲明resolve()處,表明promise對象由pending狀態(tài)轉(zhuǎn)變?yōu)閞ejected。
  • notify(value) :在聲明notify()處,表明promise對象unfulfilled狀態(tài),在resolve或reject之前可以被多次調(diào)用。

deffered 對象屬性

promise :最后返回的是一個新的deferred對象 promise 屬性,而不是原來的deferred對象。這個新的Promise對象只能觀察原來Promise對象的狀態(tài),而無法修改deferred對象的內(nèi)在狀態(tài)可以防止任務(wù)狀態(tài)被外部修改。

Promise API

當(dāng)創(chuàng)建 deferred 實(shí)例時會創(chuàng)建一個新的 promise 對象,并可以通過 deferred.promise 得到該引用。

promise 對象的目的是在 deferred 任務(wù)完成時,允許感興趣的部分取得其執(zhí)行結(jié)果。

promise 對象的方法

then(errorHandler, fulfilledHandler, progressHandler):then方法用來監(jiān)聽一個Promise的不同狀態(tài)。errorHandler監(jiān)聽failed狀態(tài),fulfilledHandler監(jiān)聽fulfilled狀態(tài),progressHandler監(jiān)聽unfulfilled(未完成)狀態(tài)。此外,notify 回調(diào)可能被調(diào)用 0到多次,提供一個進(jìn)度指示在解決或拒絕(resolve和rejected)之前。

catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式

finally(callback) ——讓你可以觀察到一個 promise 是被執(zhí)行還是被拒絕, 但這樣做不用修改最后的 value值。 這可以用來做一些釋放資源或者清理無用對象的工作,不管promise 被拒絕還是解決。 更多的信息請參閱 完整文檔規(guī)范.
通過then()方法可以實(shí)現(xiàn)promise鏈?zhǔn)秸{(diào)用。

promiseB = promiseA.then(function(result) { 
 return result + 1; 
}); 
  
// promiseB 將會在處理完 promiseA 之后立刻被處理, 
// 并且其 value值是promiseA的結(jié)果增加1 

  $q的其他方法

  • $q.when(value):傳遞變量值,promise.then()執(zhí)行成功回調(diào)
  • $q.all(promises):多個promise必須執(zhí)行成功,才能執(zhí)行成功回調(diào),傳遞值為數(shù)組或哈希值,數(shù)組中每個值為與Index對應(yīng)的

promise對象。

angular $apply ->成功響應(yīng)
angular http 請求攔截

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 利用angular自動編譯andriod APK的繞坑經(jīng)歷分享

    利用angular自動編譯andriod APK的繞坑經(jīng)歷分享

    這篇文章主要給大家介紹了關(guān)于如何利用angular自動編譯andriod APK的繞坑經(jīng)歷,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用angular具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • angular.js指令中transclude選項(xiàng)及ng-transclude指令詳解

    angular.js指令中transclude選項(xiàng)及ng-transclude指令詳解

    這篇文章主要研究一下如何使用ng-transclude指令,以及指令的transclude選項(xiàng)的相關(guān)資料,文中介紹的非常詳細(xì),并給出了完整的示例代碼大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-05-05
  • Angular2 自定義validators的實(shí)現(xiàn)方法

    Angular2 自定義validators的實(shí)現(xiàn)方法

    angular 當(dāng)需要form表單需要驗(yàn)證時,angular自帶了許多校驗(yàn)器,但是很多時候自帶的無法滿足業(yè)務(wù)需求,這時候就需要自定義的校驗(yàn)器,下面通過本文給大家分享Angular2 自定義validators的實(shí)現(xiàn)方法,需要的朋友參考下吧
    2017-07-07
  • Angular中實(shí)現(xiàn)樹形結(jié)構(gòu)視圖實(shí)例代碼

    Angular中實(shí)現(xiàn)樹形結(jié)構(gòu)視圖實(shí)例代碼

    近兩年當(dāng)中使用Angular開發(fā)過很多項(xiàng)目,其中也涉及到一些樹形結(jié)構(gòu)視圖的顯示,最近的在項(xiàng)目中封裝了大量的組件,一些組件也有樹形結(jié)構(gòu)的展示,所以寫出來總結(jié)一下。
    2017-05-05
  • angularJS 中$scope方法使用指南

    angularJS 中$scope方法使用指南

    這篇文章主要介紹了angularJS 中$scope方法使用指南,需要的朋友可以參考下
    2015-02-02
  • 老生常談angularjs中的$state.go

    老生常談angularjs中的$state.go

    下面小編就為大家?guī)硪黄仙U刟ngularjs中的$state.go。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 關(guān)于angularJs指令的Scope(作用域)介紹

    關(guān)于angularJs指令的Scope(作用域)介紹

    下面小編就為大家?guī)硪黄猘ngularJs指令的Scope(作用域)介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 簡述AngularJS相關(guān)的一些編程思想

    簡述AngularJS相關(guān)的一些編程思想

    這篇文章主要介紹了AngularJS相關(guān)的一些編程思想,AngularJS是一款熱門的JavaScript庫,推薦!需要的朋友可以參考下
    2015-06-06
  • angularjs實(shí)現(xiàn)對表單輸入改變的監(jiān)控(ng-change和watch兩種方式)

    angularjs實(shí)現(xiàn)對表單輸入改變的監(jiān)控(ng-change和watch兩種方式)

    這篇文章主要介紹了angularjs通過ng-change和watch兩種方式實(shí)現(xiàn)對表單輸入改變的監(jiān)控,需要的朋友可以參考下
    2018-08-08
  • AngularJS中的過濾器filter用法完全解析

    AngularJS中的過濾器filter用法完全解析

    這篇文章主要介紹了AngularJS中的過濾器filter用法,包括Angular中一些常用的自帶的過濾器的列舉以及自定義filter的方法,需要的朋友可以參考下
    2016-04-04

最新評論