在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

转载于:https://www.cnblogs.com/momo798/p/6180694.html

promise和Angular中的 $q, defer相关推荐

  1. angular中的$q使用详解

    AngularJS 中的Promise --- $q服务详解 先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQ ...

  2. Angular的 $q, defer, promise,$http

    $q $q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常). $q的其他方法 $q.when(value) //传递变量值,promis ...

  3. angular routerlink传递参数_[翻译]在 Angular 中使用 async-await 特性

    在 Angular 中使用 async-await 特性 原文链接: https://medium.com/@balramchavan/using-async-await-feature-in-ang ...

  4. 获取Angular中的AngularJS功能

    介绍 ( Introduction ) If you have solid experience with AngularJS 1.x, you're well aware of the framew ...

  5. 您需要了解有关Angular中的ng-template,ng-content,ng-container和* ngTemplateOutlet的所有信息...

    It was one of those days when I was busy working on new features for my office project. All a sudden ...

  6. Angular中ngCookies模块介绍

    1.Cookie介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短 ...

  7. Angular 中后台前端解决方案 - Ng Alain 介绍

    Angular 中后台前端解决方案 - Ng Alain 介绍 参考文章: (1)Angular 中后台前端解决方案 - Ng Alain 介绍 (2)https://www.cnblogs.com/ ...

  8. 将选择元素绑定到Angular中的对象

    本文翻译自:Binding select element to object in Angular I'd like to bind a select element to a list of obj ...

  9. Angular 中得 scope 作用域梳理

    2019独角兽企业重金招聘Python工程师标准>>> $scope 的使用贯穿整个 Angular App 应用,它与数据模型相关联,同时也是表达式执行的上下文.有了 $scope ...

最新文章

  1. ECCV 2020 五项大奖出炉!李飞飞高徒、徒孙共摘最佳论文奖
  2. springboot中java泛型使用
  3. html 注释_java基础- Java编程规范与注释
  4. 【Linux】一步一步学Linux——nm命令(250)
  5. java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)
  6. 【Python】Paramiko模块在Windows10中import ssl报错的处理方法
  7. CNN 反向传播推导
  8. SSO单点登录Spring-Security+CAS+使用手册.doc
  9. LinkedHashMap如何保证有序
  10. java如何配置环境变量_java如何配置环境变量
  11. 人体存在雷达传感器,毫米波雷达技术探测应用,智能感知静态人体存在
  12. 推荐两款轻量级股票看盘工具
  13. ie浏览器样式兼容写法_浏览器兼容性以及写法
  14. 国外优秀免费空间推荐 可用于测试或临时备份
  15. 已知线段上某点与起点的距离,求该点的坐标
  16. 织梦dedeCMS留言薄
  17. 从生活角度学习c++
  18. html数据的格式是什么格式的文件,.html是什么格式的文件,html文件怎么打开
  19. static char x [ ]=“12345”; 为什么比 static char y[ ]={‘1’,‘2’,‘3’,‘4’,‘5’};长?
  20. XLA编译器用于JIT加速

热门文章

  1. 她琴棋书画全能,还进入清华计算机系实验室,被赞智商太超群、能力过强悍...
  2. 量子位「MEET 2021智能未来大会」来啦!邀智能科技企业共探明日行业新格局
  3. 无人出租要遍地,Waymo百度这种报告就得常走起
  4. 腾讯开源首个医疗AI项目,业内首个3D医疗影像大数据预训练模型
  5. 以太坊DApp开发环境搭建
  6. Visual Studio开发必备:扩展工具应用
  7. nginx禁止未绑定域名访问返回444
  8. Office 365系列(3)------Office 365认证使用ADFS安装部署参考
  9. WCF契约的简单介绍(服务契约 数据契约 消息契约)
  10. Linux shell test用法