AngularJS中的Promise详细介绍及实例代码


Posted in Javascript onDecember 13, 2016

Angular中的Promise

在用jQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。

Promise

Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件。

我们知道,在编写JavaScript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。

ES6中Promise、AngularJS内置的AngularJS内置Q,以及when采用的都是Promises/A规范,如下:

每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。

  • pending状态:可以过渡到履行或拒绝状态。
  • fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。
  • 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 对象的方法

  • resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。
  • reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。
  • notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。

deffered 对象属性

promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的Promise对象只能观察原来Promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。

Promise API

当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。

promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

promise 对象的方法

then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。

catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式

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对象。

angular $apply ->成功响应
angular http 请求拦截

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript forEach通用循环遍历方法
Oct 11 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
整理AngularJS中的一些常用指令
Jun 16 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
Jan 28 Javascript
微信公众号支付H5调用支付解析
Nov 04 Javascript
jQuery代码实现实时获取时间
Jan 29 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
webpack打包非模块化js的方法
Oct 24 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
vue滚动插件better-scroll使用详解
Oct 18 Javascript
在HTML5 localStorage中存储对象的示例代码
Apr 21 Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 #Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 #Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 #Javascript
浅析Jquery操作select
Dec 13 #Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 #Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 #Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 #Javascript
You might like
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
php实现分页工具类分享
2014/01/09 PHP
php计算税后工资的方法
2015/07/28 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js获取url中"?"后面的字串方法
2014/05/15 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
简单的Vue SSR的示例代码
2018/01/12 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
Python栈类实例分析
2015/06/15 Python
Python字符串处理实现单词反转
2017/06/14 Python
python使用thrift教程的方法示例
2019/03/21 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
一岗双责责任书
2014/04/15 职场文书
销售团队获奖感言
2014/08/14 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
升学宴家长答谢词
2015/09/29 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS