淺談Angular的 $q, defer, promise

轉自:
柳絮憑風:http://www.cnblogs.com/big-sn...html

1. $qpromise

$q是Angular的一種內置服務,它可使你異步地執行函數,而且當函數執行完成時它容許你使用函數的返回值(或異常)。異步

2. deferasync

defer的字面意思是延遲,$q.defer() 能夠建立一個deferred實例(延遲對象實例)。ide

deferred 實例旨在暴露派生的Promise 實例,以及被用來做爲成功完成或未成功完成的信號API,以及當前任務的狀態。這聽起來好複雜的樣子,總結$q, defer, promise三者之間的關係以下所示。函數

var deferred = $q.defer();  //經過$q服務註冊一個延遲對象 deferred
var promise = deferred.promise;  //經過deferred延遲對象,能夠獲得    一個承諾promise,而promise會返回當前任務的完成結果

defer的方法:翻譯

1. deferred.resolve(value)  成功解決(resolve)了其派生的promise。參數value未來會被用做promise.then(successCallback(value){...}, errorCallback(reason){...}, notifyCallback(notify){...})中successCallback函數的參數。

2. deferred.reject(reason)  未成功解決其派生的promise。參數reason被用來講明未成功的緣由。此時deferred實例的promise對象將會捕獲一個任務未成功執行的錯誤,promise.catch(errorCallback(reason){...})。補充一點,promise.catch(errorCallback)實際上就是promise.then(null, errorCallback)的簡寫。

3. notify(value)  更新promise的執行狀態(翻譯的很差,原話是provides updates on the status of the promise's execution)

defer的小例子:rest

function asyncGreet(name) {
  var deferred = $q.defer();  //經過$q.defer()建立一個deferred延遲對象,在建立一個deferred實例時,也會建立出來一個派生的promise對象,使用deferred.promise就能夠檢索到派生的promise。

  deferred.notify('About to greet ' + name + '.');  //延遲對象的notify方法。

  if (okToGreet(name)) {
    deferred.resolve('Hello, ' + name + '!');  //任務被成功執行
  } else {
    deferred.reject('Greeting ' + name + ' is not allowed.');  //任務未被成功執行
  }

  return deferred.promise;  //返回deferred實例的promise對象
}

function okToGreet(name) {
  //只是mock數據,實際狀況將根據相關業務實現代碼
  if(name == 'Superman') return true;  
  else return false;
}

var promise = asyncGreet('Superman');  //得到promise對象
//promise對象的then函數會得到當前任務也就是當前deferred延遲實例的執行狀態。它的三個回調函數分別會在resolve(), reject() 和notify()時被執行
promise.then(function(greeting) {
  alert('Success: ' + greeting);
}, function(reason) {
  alert('Failed: ' + reason);
}, function(update) {
  alert('Got notification: ' + update);
});

3. promisecode

當建立一個deferred實例時,promise實例也會被建立。經過deferred.promise就能夠檢索到deferred派生的promise。htm

promise的目的是容許interested parties 訪問deferred任務完成的結果。

按照CommonJS的約定,promise是一個與對象交互的接口,表示一個動做(action)的結果是異步的,並且在任何給定的時間點上可能或不可能完成。(這句話好繞口,個人理解是promise至關於一個承諾,承諾你這個任務在給定的時間點上可能會完成,也可能完成不了。若是完成了那就至關於resolve, 若是未完成就至關於reject。不知道這樣理解對不對?)

promise 的方法:

1. then(successCallback, errorCallback, nitifyCallback) 根據promise被resolve/reject,或將要被resolve/reject,調用successCallback/errorCallback。

2. catch(errorCallback)  then(null, errorCallback)的縮寫。

3. finally(callback, notifyCallback)

補充說明:

promise.then()會返回一個新的衍生promise,造成promise鏈。例如:
promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
相關文章
相關標籤/搜索