angularjs promise

<!-- lang: js -->
var deferred = $q.defer();
var promise = deferred.promise;
promise.then(function success(data) {//成功
    console.log(data);
  },
  function error(error) {//錯(cuò)誤
    console.error(error);
  },
  function notification(notification) {//狀態(tài)
    console.info(notification);
  }));

 var progress = 0;
 var interval = $interval(function() {
  if (progress >= 100) {
    $interval.cancel(interval);
    deferred.resolve('All done!');//成功消息
  }
  progress += 10;
  deferred.notify(progress + '%...'); //狀態(tài)消息
 }, 100)

不用 then() 的第二個(gè)參數(shù)审胸,還有另外一種選擇卓缰,你可以用鏈?zhǔn)降?catch()蛛株,在 promise 鏈中發(fā)生異常的時(shí)候它會(huì)被調(diào)用(可能在很多鏈之后)抓半。

<script type="text/javascript">
         var myAppModule = angular.module("myApp",[]);
         myAppModule.controller("myctrl",["$scope","$q",function($scope, $ q ){
            $scope.test = 1;//這個(gè)只是用來測(cè)試angularjs是否正常的扔字,沒其他的作用

            var defer1 = $q.defer();
            var promise1 = defer1.promise;

            promise1
            .then(function(value){
                console.log("in promise1 ---- success");
                console.log(value);
            },function(value){
                console.log("in promise1 ---- error");
                console.log(value);
            },function(value){
                console.log("in promise1 ---- notify");
                console.log(value);
            })
            .catch(function(e){
                console.log("in promise1 ---- catch");
                console.log(e);
            })
            .finally(function(value){
                console.log('in promise1 ---- finally');
                console.log(value);
            });

            defer1.resolve("hello");
            // defer1.reject("sorry,reject");
         }]);
    </script>

鏈?zhǔn)教幚?/p>

var deferred = $q.defer();
var promise = deferred.promise;

promise
  .then(function(val) {
    console.log(val);
    return 'B';
  })
  .then(function(val) {
    console.log(val);
    return 'C'
  })
  .then(function(val) {
    console.log(val);
   });
deferred.resolve('A');

這會(huì)在控制臺(tái)輸出以下結(jié)果:

<!-- lang: js -->
A
B
C

reject,會(huì)調(diào)用catch,不調(diào)用then囊嘉,在鏈?zhǔn)秸{(diào)用的時(shí)候使用

$q.reject("instant reject") .catch(function (err) { console.log(err); });

我還提到了** $q.all(),允許你等待并行的 promise 處理革为,當(dāng)所有的 promise 都被處理結(jié)束之后扭粱,調(diào)用共同的回調(diào)。在 Angular 中震檩,這個(gè)方法有兩種調(diào)用方式: 以 Array 方式或 Object **方式琢蛤。Array 方式接收多個(gè) promise ,然后在調(diào)用 .then() 的時(shí)候使用一個(gè)數(shù)據(jù)結(jié)果對(duì)象抛虏,在結(jié)果對(duì)象里面包含了所有的 promise 結(jié)果博其,按照輸入數(shù)組的順序排列:

<!-- lang: js -->
$q.all([promiseOne, promiseTwo, promiseThree])
  .then(function(results) {
    console.log(results[0], results[1], results[2]);
  });

第二種方式是接收一個(gè) promise 集合對(duì)象,允許你給每個(gè) promise 一個(gè)別名迂猴,在回調(diào)函數(shù)中可以使用它們(有更好的可讀性):

<!-- lang: js -->
$q.all({ first: promiseOne, second: promiseTwo, third: promiseThree })
  .then(function(results) {
    console.log(results.first, results.second, results.third);
  });

我建議使用數(shù)組表示法慕淡,如果你只是希望可以批處理結(jié)果,就是說沸毁,如果你把所有的結(jié)果都平等處理峰髓。而以對(duì)象方式來處理,則更適合需要自注釋代碼的時(shí)候以清。
另一個(gè)有用的方法是** $q.when()**儿普,如果你想通過一個(gè)普通變量創(chuàng)建一個(gè) promise ,或者你不清楚你要處理的對(duì)象是不是 promise 時(shí)非常有用掷倔。

<!-- lang: js -->
$q.when('foo')
  .then(function(bar) {
    console.log(bar);
  });

$q.when(aPromise)
  .then(function(baz) {
    console.log(baz);
  });

$q.when(valueOrPromise)
  .then(function(boz) {
    // well you get the idea.
  })

$q.when() 在諸如服務(wù)中的緩存這種情況也很好用:
接收第一個(gè)參數(shù)為一個(gè)任意值或者是一個(gè)promise對(duì)象眉孩,其他3個(gè)同promise的then方法,返回值為一個(gè)promise對(duì)象。第一個(gè)參數(shù)若不是promise對(duì)象則直接運(yùn)行success回調(diào)且消息為這個(gè)對(duì)象,若為promise那么返回的promise其實(shí)就是對(duì)這個(gè)promise類型的參數(shù)的一個(gè)包裝而已浪汪,被傳入的這個(gè)promise對(duì)應(yīng)的defer發(fā)送的消息巴柿,會(huì)被我們when函數(shù)返回的promise對(duì)象所接收到。

var defer1 = $q.defer();
var promise1 = defer1.promise;
var promise2 = $q.when(promise1, function(num) {
       console.log("s" + num);
}, function() {
       console.log("e");
});
defer1.reject(1);
運(yùn)行結(jié)果:
e
<!-- lang: js -->
angular.module('myApp').service('MyService', function($q, MyResource) {

  var cachedSomething;

  this.getSomething = function() {
    if (cachedSomething) {
      return $q.when(cachedSomething);
    }

    // on first call, return the result of MyResource.get()
    // note that 'then()' is chainable / returns a promise,
    // so we can return that instead of a separate promise object
    return MyResource.get().$promise
      .then(function(something) {
        cachedSomething = something
      });
  };
});
然后可以這樣調(diào)用它:
<!-- lang: js -->
MyService.getSomething()
    .then(function(something) {
        console.log(something);
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末死遭,一起剝皮案震驚了整個(gè)濱河市广恢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呀潭,老刑警劉巖钉迷,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钠署,居然都是意外死亡糠聪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谐鼎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舰蟆,“玉大人,你說我怎么就攤上這事狸棍∩砗Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵草戈,是天一觀的道長(zhǎng)塌鸯。 經(jīng)常有香客問我,道長(zhǎng)猾瘸,這世上最難降的妖魔是什么界赔? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮牵触,結(jié)果婚禮上淮悼,老公的妹妹穿的比我還像新娘。我一直安慰自己揽思,他們只是感情好袜腥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钉汗,像睡著了一般羹令。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损痰,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天福侈,我揣著相機(jī)與錄音,去河邊找鬼卢未。 笑死肪凛,一個(gè)胖子當(dāng)著我的面吹牛堰汉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伟墙,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼翘鸭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了戳葵?” 一聲冷哼從身側(cè)響起就乓,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拱烁,沒想到半個(gè)月后生蚁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邻梆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年守伸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浦妄。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖见芹,靈堂內(nèi)的尸體忽然破棺而出剂娄,到底是詐尸還是另有隱情,我是刑警寧澤玄呛,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布阅懦,位于F島的核電站,受9級(jí)特大地震影響徘铝,放射性物質(zhì)發(fā)生泄漏耳胎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一惕它、第九天 我趴在偏房一處隱蔽的房頂上張望怕午。 院中可真熱鬧,春花似錦淹魄、人聲如沸郁惜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兆蕉。三九已至,卻和暖如春缤沦,著一層夾襖步出監(jiān)牢的瞬間虎韵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工缸废, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留包蓝,地道東北人驶社。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像养晋,于是被迫代替她去往敵國(guó)和親衬吆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容