淺談Angular的$q, defer, promise
1. $q
$q是Angular的一種內(nèi)置服務(wù),它可以使你異步地執(zhí)行函數(shù),并且當(dāng)函數(shù)執(zhí)行完成時(shí)它允許你使用函數(shù)的返回值(或異常)。
2. defer
defer的字面意思是延遲,$q.defer() 可以創(chuàng)建一個(gè)deferred實(shí)例(延遲對(duì)象實(shí)例)。
deferred 實(shí)例旨在暴露派生的Promise 實(shí)例,以及被用來作為成功完成或未成功完成的信號(hào)API,以及當(dāng)前任務(wù)的狀態(tài)。這聽起來好復(fù)雜的樣子,總結(jié)$q, defer, promise三者之間的關(guān)系如下所示。
var deferred = $q.defer(); //通過$q服務(wù)注冊(cè)一個(gè)延遲對(duì)象 deferred var promise = deferred.promise; //通過deferred延遲對(duì)象,可以得到一個(gè)承諾promise,而promise會(huì)返回當(dāng)前任務(wù)的完成結(jié)果
defer的方法:
- deferred.resolve(value) 成功解決(resolve)了其派生的promise。參數(shù)value將來會(huì)被用作promise.then(successCallback(value){...}, errorCallback(reason){...}, notifyCallback(notify){...})中successCallback函數(shù)的參數(shù)。
- deferred.reject(reason) 未成功解決其派生的promise。參數(shù)reason被用來說明未成功的原因。此時(shí)deferred實(shí)例的promise對(duì)象將會(huì)捕獲一個(gè)任務(wù)未成功執(zhí)行的錯(cuò)誤,promise.catch(errorCallback(reason){...})。補(bǔ)充一點(diǎn),promise.catch(errorCallback)實(shí)際上就是promise.then(null, errorCallback)的簡寫。
- notify(value) 更新promise的執(zhí)行狀態(tài)(翻譯的不好,原話是provides updates on the status of the promise's execution)
defer的小例子:
function asyncGreet(name) { var deferred = $q.defer(); //通過$q.defer()創(chuàng)建一個(gè)deferred延遲對(duì)象,在創(chuàng)建一個(gè)deferred實(shí)例時(shí),也會(huì)創(chuàng)建出來一個(gè)派生的promise對(duì)象,使用deferred.promise就可以檢索到派生的promise。 deferred.notify('About to greet ' + name + '.'); //延遲對(duì)象的notify方法。 if (okToGreet(name)) { deferred.resolve('Hello, ' + name + '!'); //任務(wù)被成功執(zhí)行 } else { deferred.reject('Greeting ' + name + ' is not allowed.'); //任務(wù)未被成功執(zhí)行 } return deferred.promise; //返回deferred實(shí)例的promise對(duì)象 } function okToGreet(name) { //只是mock數(shù)據(jù),實(shí)際情況將根據(jù)相關(guān)業(yè)務(wù)實(shí)現(xiàn)代碼 if(name == 'Superman') return true; else return false; } var promise = asyncGreet('Superman'); //獲得promise對(duì)象 //promise對(duì)象的then函數(shù)會(huì)獲得當(dāng)前任務(wù)也就是當(dāng)前deferred延遲實(shí)例的執(zhí)行狀態(tài)。它的三個(gè)回調(diào)函數(shù)分別會(huì)在resolve(), reject() 和notify()時(shí)被執(zhí)行 promise.then(function(greeting) { alert('Success: ' + greeting); }, function(reason) { alert('Failed: ' + reason); }, function(update) { alert('Got notification: ' + update); });
3. promise
當(dāng)創(chuàng)建一個(gè)deferred實(shí)例時(shí),promise實(shí)例也會(huì)被創(chuàng)建。通過deferred.promise就可以檢索到deferred派生的promise。
promise的目的是允許interested parties 訪問deferred任務(wù)完成的結(jié)果。
按照CommonJS的約定,promise是一個(gè)與對(duì)象交互的接口,表示一個(gè)動(dòng)作(action)的結(jié)果是異步的,而且在任何給定的時(shí)間點(diǎn)上可能或不可能完成。(這句話好繞口,我的理解是promise相當(dāng)于一個(gè)承諾,承諾你這個(gè)任務(wù)在給定的時(shí)間點(diǎn)上可能會(huì)完成,也可能完成不了。如果完成了那就相當(dāng)于resolve, 如果未完成就相當(dāng)于reject。不知道這樣理解對(duì)不對(duì)?)
promise 的方法:
- then(successCallback, errorCallback, nitifyCallback) 根據(jù)promise被resolve/reject,或?qū)⒁籸esolve/reject,調(diào)用successCallback/errorCallback。
- catch(errorCallback) then(null, errorCallback)的縮寫。
- finally(callback, notifyCallback)
補(bǔ)充說明:
promise.then()會(huì)返回一個(gè)新的衍生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
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- AngularJS中update兩次出現(xiàn)$promise屬性無法識(shí)別的解決方法
- AngularJS中的Promise詳細(xì)介紹及實(shí)例代碼
- AngularJS 中的Promise --- $q服務(wù)詳解
- 詳解Javacript和AngularJS中的Promises
- AngularJS中處理多個(gè)promise的方式
- Angular中的Promise對(duì)象($q介紹)
- 淺析Angular2子模塊以及異步加載
- 詳解Angular.js的$q.defer()服務(wù)異步處理
- AngularJS出現(xiàn)$http異步后臺(tái)無法獲取請(qǐng)求參數(shù)問題的解決方法
- AngularJS 實(shí)現(xiàn)按需異步加載實(shí)例代碼
- angularjs 處理多個(gè)異步請(qǐng)求方法匯總
- AngularJS中的promise用法分析
相關(guān)文章
AngularJS監(jiān)聽ng-repeat渲染完成的方法
這篇文章主要介紹了AngularJS監(jiān)聽ng-repeat渲染完成的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Angular?Tree?Shaking優(yōu)化機(jī)制原理詳解
這篇文章主要為大家介紹了Angular?Tree?Shaking優(yōu)化機(jī)制原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10利用Angularjs和bootstrap實(shí)現(xiàn)購物車功能
在學(xué)習(xí)了如何簡單開始一個(gè)Angular程序之后,跟著網(wǎng)上的教程我也來實(shí)現(xiàn)一個(gè)購物車功能,為了減少頁面樣式設(shè)計(jì)我使用了bootstrap來偷懶,現(xiàn)在分享給大家,有需要的可以參考借鑒。2016-08-08淺談angularjs依賴服務(wù)注入寫法的注意點(diǎn)
下面小編就為大家?guī)硪黄獪\談angularjs依賴服務(wù)注入寫法的注意點(diǎn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04AngularJS基礎(chǔ) ng-cut 指令介紹及簡單示例
本文主要介紹AngularJS ng-cut 指令,這里對(duì)ng-cut指令的基礎(chǔ)資料進(jìn)行了整理,和詳細(xì)介紹,并附上代碼示例和實(shí)現(xiàn)效果圖,學(xué)習(xí)AngularJS 指令的朋友可以參考下2016-08-08Angular應(yīng)用打包和部署實(shí)現(xiàn)過程詳解
這篇文章主要為大家介紹了Angular應(yīng)用打包和部署實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08基于angular6.0實(shí)現(xiàn)的一個(gè)組件懶加載功能示例
這篇文章主要介紹了基于angular6.0實(shí)現(xiàn)的一個(gè)組件懶加載功能示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04