轉自:
柳絮憑風: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