promise和Angular中的 $q, defer
在ES6语法中,新出了promise构造函数, 可用来生成promise实例。
Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)。有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱')。
在Angularjs中,对象deferred 实例也可以暴露派生的Promise 实例。以下将对此作简单描述:
1. $q:
$q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常)。
2. defer:
defer的字面意思是延迟,$q.defer() 可以创建一个deferred实例(延迟对象实例)。
Deferred对象的意义在于将非Promise的异步流程包装成Promise,deferred 实例旨在暴露派生的Promise 实例,以及被用来作为成功完成或未成功完成的信号API,以及当前任务的状态。
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) :provides updates on the status of the promise's execution。
以下是一个小例子:
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 的方法:
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
原文地址:http://www.cnblogs.com/big-snow/p/5126059.html
最新文章
- js数组转换问题
- POJ 2718 Smallest Difference【DFS】
- Android应用开发中出现appcompat-v7错误
- OPNET下 op_pk_copy()的时间问题
- 整数分解 &;&; 质因数分解
- Windows Server 2012 如何实现多个用户远程桌面登陆?
- apple配置WIFI热点
- android 项目学习随笔五(JSON解析)
- plsql配置连接远程数据库
- BS开发平台,一小时搞定功能强大的统计分析页面
- Linux 进程通信之 ——信号和信号量总结
- a/b + c/d
- MYSQL数据库-SELECT详解
- 大数据 -->; Kafka集群搭建
- springboot集成redis(mybatis、分布式session)
- Docker标准化开发测试和生产环境
- ServiceMesh究竟解决什么问题?
- Git安装及密钥的生成(转)
- Servlet——提交表单信息,Servlet之间的跳转
- EXCEL通俗易懂讲公式(一):sumif,sumifs,countif,countifs
热门文章
- how to develop mobile web
- ANDROID_MARS学习笔记_S05_006_距离传感器
- FishEye简介
- struts2结合生成验证码
- 【HDOJ】1597 find the nth digit
- Set up JBPM5.4 Final Installer to use MS SQL Server 2008 using JTDS(转)
- MongoDB的备份(mongodump)与恢复(mongorestore)
- pyhton 查找一个数的所有因子 以及 判断一个数是否是质数 两个小脚本
- 有7g和2g的砝码各一个,怎样称可以3次把140g东西分为50g和90g???????
- 传输层之UDP