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 相关文章推荐
jQuery中filter(),not(),split()使用方法
Jul 06 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
May 22 Javascript
javascritp添加url参数将参数加入到url中
Sep 25 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
分享bootstrap学习笔记心得(组件及其属性)
Jan 11 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
Feb 04 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
Mar 14 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
webpack dll打包重复问题优化的解决
Oct 10 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
关于svn冲突的解决方法
2013/06/21 PHP
php数组键值用法实例分析
2015/02/27 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
javascript 表单规则集合对象
2009/07/21 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
vue组件生命周期详解
2017/11/07 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
js代码实现轮播图
2020/05/04 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
在Python中使用SQLite的简单教程
2015/04/29 Python
python访问类中docstring注释的实现方法
2015/05/04 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
高中军训感言600字
2014/03/11 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书