AngularJS $q的方法介紹

2018-07-26 17:00 更新

$q 有四個(gè)方法:

  • $q.all() 合并多個(gè) promise ,得到一個(gè)新的 promise
  • $q.defer() 返回一個(gè) deferred 對(duì)象
  • $q.reject() 包裝一個(gè)錯(cuò)誤,以使回調(diào)鏈能正確處理下去
  • $q.when() 返回一個(gè) promise 對(duì)象

$q.all() 方法適用于并發(fā)場(chǎng)景很合適:

angular.module('app', [], angular.noop)
.controller('TestCtrl', function($scope){
  var p = $http.get('/json', {params: {a: 1}});
  var p2 = $http.get('/json', {params: {a: 2}});
  var all = $q.all([p, p2]);
  p.success(function(res){console.log('here')});
  all.then(function(res){console.log(res[0])});
});

$q.reject() 方法是在你捕捉異常之后,又要把這個(gè)異常在回調(diào)鏈中傳下去時(shí)使用:

要理解這東西,先看看 promise 的鏈?zhǔn)交卣{(diào)是如何運(yùn)作的,看下面兩段代碼的區(qū)別:

var defer = $q.defer();
var p = defer.promise;
p.then(
  function(data){return 'xxx'}
);
p.then(
  function(data){console.log(data)}
);
defer.resolve('123');
var defer = $q.defer();
var p = defer.promise;
var p2 = p.then(
  function(data){return 'xxx'}
);
p2.then(
  function(data){console.log(data)}
);
defer.resolve('123');

從模型上看,前者是“并發(fā)”,后者才是“鏈?zhǔn)健薄?/p>

而 $q.reject() 的作用就是觸發(fā)后鏈的 error 回調(diào):

var defer = $q.defer();
var p = defer.promise;
p.then(
  function(data){return data},
  function(data){return $q.reject(data)}
).
then(
  function(data){console.log('ok, ' + data)},
  function(data){console.log('error, ' + data)}
)
defer.reject('123');

最后的 $q.when() 是把數(shù)據(jù)封裝成 promise 對(duì)象:

var p = $q.when(0, function(data){return data},
                   function(data){return data});
p.then(
  function(data){console.log('ok, ' + data)},
  function(data){console.log('error, ' + data)}
);


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)