Angular中的Promise对象($q介绍)
在用jquery的时候就知道 promise 是 js异步编程模式的一种模式,但是不是很明白他跟jquery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。
promise
promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件。
我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。
es6中promise、angularjs内置的angularjs内置q,以及when采用的都是promises/a规范,如下:
每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。
1.pending状态:可以过渡到履行或拒绝状态。
2.fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。
3.rejected状态:不能变为其他任何状态,而且状态不能改变,必须有reason。
状态的转移是一次性的,状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),就不能再变了。
function oktogreet(name){
return name === 'robin hood';
}
function asyncgreet(name) {
var deferred = $q.defer();
settimeout(function() {
// 因为这个异步函数fn在未来的异步执行,我们把代码包装到 $apply 调用中,一边正确的观察到 model 的改变
$scope.$apply(function() {
deferred.notify('about to greet ' + name + '.');
if (oktogreet(name)) {
deferred.resolve('hello, ' + name + '!');
} else {
deferred.reject('greeting ' + name + ' is not allowed.');
}
});
}, 1000);
return deferred.promise;
}
var promise = asyncgreet('robin hood');
promise.then(function(greeting) {
alert('success: ' + greeting);
}, function(reason) {
alert('failed: ' + reason);
}, function(update) {
alert('got notification: ' + update);
});
q promise的基本用法
上面代码表示, $q.defer() 构建的 deffered 实例的几个方法的作用。如果异步操作成功,则用resolve方法将promise对象的状态变为“成功”(即从pending变为resolved);如果异步操作失败,则用reject方法将状态变为“失败”(即从pending变为rejected)。最后返回 deferred.promise ,我们就可以链式调用then方法。
js将要有原生promise,es6中已经有promise对象,firefox和chrome 32 beta版本已经实现了基本的promise api
angularjs中的$q.defferd
通过 调用 $q.defferd 返回deffered对象以链式调用。该对象将promises/a规范中的三个任务状态通过api关联。
deffered api
deffered 对象的方法
1.resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。
2.reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。
3.notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。
deffered 对象属性
promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的promise对象只能观察原来promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。
promise api
当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。
promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。
promise 对象的方法
1.then(errorhandler, fulfilledhandler, progresshandler):then方法用来监听一个promise的不同状态。errorhandler监听failed状态,fulfilledhandler监听fulfilled状态,progresshandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。
2.catch(errorcallback) —— promise.then(null, errorcallback) 的快捷方式
3.finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息请参阅 完整文档规范.
通过then()方法可以实现promise链式调用。
promiseb = promisea.then(function(result) {
return result + 1;
});
// promiseb 将会在处理完 promisea 之后立刻被处理,
// 并且其 value值是promisea的结果增加1
$q的其他方法
$q.when(value):传递变量值,promise.then()执行成功回调
$q.all(promises):多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与index对应的promise对象
上一篇: AngularJS内置指令
推荐阅读
-
Angular.js中ng-if、ng-show和ng-hide的区别介绍
-
EL表达式及其11个使用对象(及jsp中的对象)实例介绍
-
Scrapy 中 Request 对象和 Response 对象的各参数及属性介绍
-
PowerShell中Get-Date对象的常用属性和方法介绍
-
angular4中*ngFor不能对返回来的对象进行循环的解决方法
-
AI移动画布中的各种元素对象方法介绍
-
详解Angular.js中$http拦截器的介绍及使用
-
js框架中angular、vue、react的三者的区别介绍
-
Servlet映射、Servlet中的两个init()方法、Servlet中的config对象介绍
-
Jsp中response对象的所有属性详细介绍