浅谈Angular的$q, defer, promise


Posted in Javascript onDecember 20, 2016

1. $q

$q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常)。

2. defer

defer的字面意思是延迟,$q.defer() 可以创建一个deferred实例(延迟对象实例)。

deferred 实例旨在暴露派生的Promise 实例,以及被用来作为成功完成或未成功完成的信号API,以及当前任务的状态。这听起来好复杂的样子,总结$q, defer, promise三者之间的关系如下所示。

var deferred = $q.defer(); //通过$q服务注册一个延迟对象 deferred
var promise = deferred.promise; //通过deferred延迟对象,可以得到一个承诺promise,而promise会返回当前任务的完成结果

defer的方法:

  • deferred.resolve(value)  成功解决(resolve)了其派生的promise。参数value将来会被用作promise.then(successCallback(value){...}, errorCallback(reason){...}, notifyCallback(notify){...})中successCallback函数的参数。
  • deferred.reject(reason)  未成功解决其派生的promise。参数reason被用来说明未成功的原因。此时deferred实例的promise对象将会捕获一个任务未成功执行的错误,promise.catch(errorCallback(reason){...})。补充一点,promise.catch(errorCallback)实际上就是promise.then(null, errorCallback)的简写。
  • notify(value)  更新promise的执行状态(翻译的不好,原话是provides updates on the status of the promise's execution)

defer的小例子:   

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. promise

当创建一个deferred实例时,promise实例也会被创建。通过deferred.promise就可以检索到deferred派生的promise。

promise的目的是允许interested parties 访问deferred任务完成的结果。

按照CommonJS的约定,promise是一个与对象交互的接口,表示一个动作(action)的结果是异步的,而且在任何给定的时间点上可能或不可能完成。(这句话好绕口,我的理解是promise相当于一个承诺,承诺你这个任务在给定的时间点上可能会完成,也可能完成不了。如果完成了那就相当于resolve, 如果未完成就相当于reject。不知道这样理解对不对?)

promise 的方法:

  • then(successCallback, errorCallback, nitifyCallback) 根据promise被resolve/reject,或将要被resolve/reject,调用successCallback/errorCallback。
  • catch(errorCallback)  then(null, errorCallback)的缩写。
  • 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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js更优雅的兼容
Aug 12 Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
JQuery文字列表向上滚动的代码
Nov 13 Javascript
Javascript中的getUTCDay()方法使用详解
Jun 10 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
AngularJS 输入验证详解及实例代码
Jul 28 Javascript
PHP抓取HTTPS内容和错误处理的方法
Sep 30 Javascript
Bootstrap select多选下拉框实现代码
Dec 23 Javascript
Vue.js仿Metronic高级表格(一)静态设计
Apr 17 Javascript
JS实现简单随机3D骰子
Oct 24 Javascript
javascript实现移动端上传图片功能
Aug 18 Javascript
Javascript实现单选框效果
Dec 09 Javascript
BootStrapTable服务器分页实例解析
Dec 20 #Javascript
bootstrap实现每隔5秒自动轮播效果
Dec 20 #Javascript
bootstrap多种样式进度条展示
Dec 20 #Javascript
JS封装通过className获取元素的函数示例
Dec 20 #Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
Dec 20 #Javascript
jquery+html仿翻页相册功能
Dec 20 #Javascript
JS实现拖拽的方法分析
Dec 20 #Javascript
You might like
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
Python 对输入的数字进行排序的方法
2018/06/23 Python
python实现括号匹配的思路详解
2018/08/23 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
基于pandas中expand的作用详解
2019/12/17 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
工程业务员岗位职责
2013/12/31 职场文书
项目开发计划书
2014/01/09 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
学生上课说话检讨书
2014/10/25 职场文书
聚会通知怎么写
2015/04/23 职场文书
孔子观后感
2015/06/08 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
中秋晚会致辞
2015/07/31 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书