小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

淺談Angular的 $q, defer, promise

 昵稱10504424 2016-01-13

1. $q

$q是Angular的一種內(nèi)置服務(wù),它可以使你異步地執(zhí)行函數(shù),并且當函數(shù)執(zhí)行完成時它允許你使用函數(shù)的返回值(或異常)。

2. defer

defer的字面意思是延遲,$q.defer() 可以創(chuàng)建一個deferred實例(延遲對象實例)。

deferred 實例旨在暴露派生的Promise 實例,以及被用來作為成功完成或未成功完成的信號API,以及當前任務(wù)的狀態(tài)。這聽起來好復(fù)雜的樣子,總結(jié)$q, defer, promise三者之間的關(guān)系如下所示。

var deferred = $q.defer();  //通過$q服務(wù)注冊一個延遲對象 deferred
var promise = deferred.promise;  //通過deferred延遲對象,可以得到一個承諾promise,而promise會返回當前任務(wù)的完成結(jié)果

defer的方法:

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

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

    3. notify(value)  更新promise的執(zhí)行狀態(tài)(翻譯的不好,原話是provides updates on the status of the promise's execution)

defer的小例子:    

復(fù)制代碼
function asyncGreet(name) {
  var deferred = $q.defer();  //通過$q.defer()創(chuàng)建一個deferred延遲對象,在創(chuàng)建一個deferred實例時,也會創(chuàng)建出來一個派生的promise對象,使用deferred.promise就可以檢索到派生的promise。

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

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

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

function okToGreet(name) {
  //只是mock數(shù)據(jù),實際情況將根據(jù)相關(guān)業(yè)務(wù)實現(xiàn)代碼
  if(name == 'Superman') return true;  
  else return false;
}

var promise = asyncGreet('Superman');  //獲得promise對象
//promise對象的then函數(shù)會獲得當前任務(wù)也就是當前deferred延遲實例的執(zhí)行狀態(tài)。它的三個回調(diào)函數(shù)分別會在resolve(), reject() 和notify()時被執(zhí)行
promise.then(function(greeting) {
  alert('Success: ' + greeting);
}, function(reason) {
  alert('Failed: ' + reason);
}, function(update) {
  alert('Got notification: ' + update);
});
復(fù)制代碼

3. promise

當創(chuàng)建一個deferred實例時,promise實例也會被創(chuàng)建。通過deferred.promise就可以檢索到deferred派生的promise。

promise的目的是允許interested parties 訪問deferred任務(wù)完成的結(jié)果。

按照CommonJS的約定,promise是一個與對象交互的接口,表示一個動作(action)的結(jié)果是異步的,而且在任何給定的時間點上可能或不可能完成。(這句話好繞口,我的理解是promise相當于一個承諾,承諾你這個任務(wù)在給定的時間點上可能會完成,也可能完成不了。如果完成了那就相當于resolve, 如果未完成就相當于reject。不知道這樣理解對不對?)

promise 的方法:

    1. then(successCallback, errorCallback, nitifyCallback) 根據(jù)promise被resolve/reject,或?qū)⒁籸esolve/reject,調(diào)用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

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多