angularjs 1.x $q模块使用
什么是$q
$q是angularjs1.x中內(nèi)置服務(wù),在需要使用時可以注入它。
angular.module('app').controller('myController', function myController($q){// further operation.. });?
為什么使用$q
$q的使用目的是為了提供更好的異步編程解決方案。
?
?
來看看$q的api:
$q.defer()
$q.defer執(zhí)行時返回一個延遲對象(defer)。延遲對象有三種狀態(tài): resolve(解決), reject(拒絕), notify(通知)。
同時這三種狀態(tài)在defer對象下各有一個同名方法,用于改變defer對象的狀態(tài)值。
一旦狀態(tài)更改成resolve或reject了,就無法改回來了,這點要注意。
同時,在執(zhí)行defer.resolve(), defer.reject(), defer.notify()時,可以傳入一個參數(shù),這個參數(shù)將成為
對應(yīng)回調(diào)函數(shù)的參數(shù)。看個例子
var defer = $q.defer(); var myPic = new Image();myPic.onload = function(){defer.resolve(myPic); }myPic.onerror = function(){defer.reject(); }defer.promise.then(function(img){console.log('download complete');// 這里可以對參數(shù)img進(jìn)行操作 }, function(reason){console.log('network error'); });
myPic.src = '/somefile/someimage';
這個例子中,對image的加載做了一些封裝。
當(dāng)圖片加載完成或加載失敗,會在控制臺輸出一些提示。
可能在這個例子中,$q發(fā)揮的作用并不大,但是放到一些特殊的場景,
它將發(fā)揮奇效。
?
promise
promise(承諾)對象是defer下的屬性,它有一些方法處理回調(diào)函數(shù),當(dāng)defer對象的狀態(tài)變更時,
promise會執(zhí)行相應(yīng)的回調(diào)。
?
promise.then(resolveCallback, rejectCallback, notifyCallback)
then方法的三種回調(diào)分別對應(yīng)promise的三種狀態(tài)的處理。
返回一個promise。也就是說,then方法可以應(yīng)用鏈?zhǔn)綄懛ā?/p>
注意的是,前面then方法中的resolveCallback的返回值,將會成為后面then方法的resolveCallback的參數(shù)。(其他同理)
angular.module('app').controller('myController', function myController($q){var defer1 = $q.defer();defer1.promise.then(function resolveCallback(result){console.log('resolve callback: ' + result);}, function rejectCallback(reason){console.log('reject回調(diào)不會執(zhí)行');}, function notifyCallback(message){console.log('notify callback: ' + message);});defer1.notify('promise got message');defer1.resolve('promise resolve'); });// notify callback: promise got message // resolve callback: promise resolvenofity不限制調(diào)用次數(shù)(應(yīng)用于進(jìn)度更改通知);
?
promise.catch(rejectCallback)
catch方法是then方法的一個語法糖,相當(dāng)于promise.then(null, rejectCallback)。
?
promise.finally(callback)
在一些舊瀏覽器,finally是保留字,你可能要這么調(diào)用它: promise['finally'](callback)。
?
$q.reject(value)
返回一個promise。該promise的狀態(tài)是reject。
也就是說,返回值會馬上執(zhí)行鏈?zhǔn)讲僮髦械膔eject的處理方法,如:
$q.reject(reason).then(function(result){console.log('this would never implement'); }, function(reason){console.log('promise reject! reason: ' + reason); });// or $q.reject(reason).catch(function(reason){console.log('reject reason: ' + reason); });?
?
$q.when(value)
when方法用于封裝一個可能是defer對象的值。返回一個promise對象。
如果輸入值是promise時,將返回一個promise,當(dāng)它狀態(tài)改變時執(zhí)行后續(xù)的鏈?zhǔn)讲僮鳌?/p>
如果輸入的是一個普通值,也返回一個promise,并且該promise的狀態(tài)是resolve。換句話說,后面的鏈?zhǔn)讲僮鲿R上跑起來。
你也可以理解為$q.when 和 $q.reject 是一對對應(yīng)的方法。
?
$q.all(promises)
all方法用于將多個promise綁定稱為單個的promise。
它接受一個promise數(shù)組作為參數(shù),返回一個promise對象。
當(dāng)所有的promise都變成resolve狀態(tài)時,才會執(zhí)行回調(diào)。
?
參考:https://www.bennadel.com/blog/2735-q-when-is-the-missing-q-resolve-method-in-angularjs.htm
轉(zhuǎn)載于:https://www.cnblogs.com/ohmyladygaga/p/6236408.html
總結(jié)
以上是生活随笔為你收集整理的angularjs 1.x $q模块使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何静态添加toolbar到datagr
- 下一篇: ROWID伪列