在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

最新文章

  1. js数组转换问题
  2. POJ 2718 Smallest Difference【DFS】
  3. Android应用开发中出现appcompat-v7错误
  4. OPNET下 op_pk_copy()的时间问题
  5. 整数分解 && 质因数分解
  6. Windows Server 2012 如何实现多个用户远程桌面登陆?
  7. apple配置WIFI热点
  8. android 项目学习随笔五(JSON解析)
  9. plsql配置连接远程数据库
  10. BS开发平台,一小时搞定功能强大的统计分析页面
  11. Linux 进程通信之 ——信号和信号量总结
  12. a/b + c/d
  13. MYSQL数据库-SELECT详解
  14. 大数据 --> Kafka集群搭建
  15. springboot集成redis(mybatis、分布式session)
  16. Docker标准化开发测试和生产环境
  17. ServiceMesh究竟解决什么问题?
  18. Git安装及密钥的生成(转)
  19. Servlet——提交表单信息,Servlet之间的跳转
  20. EXCEL通俗易懂讲公式(一):sumif,sumifs,countif,countifs

热门文章

  1. how to develop mobile web
  2. ANDROID_MARS学习笔记_S05_006_距离传感器
  3. FishEye简介
  4. struts2结合生成验证码
  5. 【HDOJ】1597 find the nth digit
  6. Set up JBPM5.4 Final Installer to use MS SQL Server 2008 using JTDS(转)
  7. MongoDB的备份(mongodump)与恢复(mongorestore)
  8. pyhton 查找一个数的所有因子 以及 判断一个数是否是质数 两个小脚本
  9. 有7g和2g的砝码各一个,怎样称可以3次把140g东西分为50g和90g???????
  10. 传输层之UDP