引用:

​下面我们通过讲解$q的API让你更多的了解promise异步编程模式。$q是做为angularjs的一个服务而存在的,只是对promise异步编程模式的一个简化实现版,源码中剔除注释实现代码也就二百多行,下面开始介绍$q的API。

defer对象(延迟对象)可以通$q.defer()获取,下面是defer对象的api:

方法:

resolve(value):向promise对象异步执行体发送消息告诉他我已经成功完成任务,value即为发送的消息。

reject(value): 向promise对象异步执行体发送消息告诉他我已经不可能完成这个任务了,value即为发送的消息。

notify(value): 向promise对象异步执行体发送消息告诉他我现在任务完成的情况,value即为发送的消息。

  这些消息发送完promise会调用现有的回调函数。

属性:

promise即与这个defer对象的承诺对象。

  从上可以看出defer主要是用来发送消息的。

  promise对象可以通过defer.promise获取,下面是promise对象的api:

方法:

  then(successCallback,errorCallback,notifyCallback):参数为不同消息下的不同回调函数,defer发送不同的消息执行不同的回调函数,消息作为这些回调函数的参数传递。返回值为回一个promise对象为支持链式调用而存在。当第一个defer对象发送消息后,后面的promise对应的defer对象也会发送消息,但是发送的消息不一样,不管第一个defer对象发送的是reject还是resolve,第二个及其以后的都是发送的resolve,消息是可传递的。

  catch(errorCallback):then(null,errorCallback)的缩写。

  finally(callback):相当于then(callback,callback)的缩写,这个finally中的方法不接受参数,却可以将defer发送的消息和消息类型成功传递到下一个then中。

方法:

  defer():用来生成一个延迟对象 var defer =$q.defer();

  reject():参数接收错误消息,相当于在回调函数中抛出一个异常,然后在下一个then中调用错误的回调函数。

 all():参数接收为一个promise数组,返回一个新的单一promise对象,当这些promise对象对应defer对象全部解决这个单一promise对象才会解决,当这些promise对象中有一个被reject了,这个单一promise同样的被reject了。

 when():接收第一个参数为一个任意值或者是一个promise对象,其他3个同promise的then方法,返回值为一个promise对象。第一个参数若不是promise对象则直接运行success回调且消息为这个对象,若为promise那么返回的promise其实就是对这个promise类型的参数的一个包装而已,被传入的这个promise对应的defer发送的消息,会被我们when函数返回的promise对象所接收到。

代码示例:

/**
 * 上传文件
 * @param formData 附带参数
 * @param success 成功回调 function
 * @param error 失败回调 function
 * @param progress 上传进度 function
 */
hyHttp.upload = function(formData){var deferred = $q.defer();

    var url = encodeURI(this._url);
    var xhr = new window.XMLHttpRequest();
    if(xhr == null){throw new Error('您的浏览器不支持AJAX上传,请选择其他方式!');
    }xhr.onload = function(){if(xhr.readyState == 4){if(xhr.status == 200){deferred.resolve(xhr);
            }}};

    xhr.onerror = function(){deferred.reject(xhr);
    };

    xhr.upload.onprogress = function(event){if (event.lengthComputable) {deferred.notify(event);
        }};

    xhr.open('POST',url,true);
    xhr.setRequestHeader("","");
    xhr.send(formData);

    var promise = deferred.promise;
    promise.success = function(fn) {promise.then(function(response) {fn(response);
        });
        return promise;
    };
    promise.error = function(fn) {promise.then(null, function(response) {fn(response);
        });
        return promise;
    };
    promise.progress = function(fn) {promise.then(null,null,function(response) {fn(response);
        });
        return promise;
    };

    return promise;
};

AngularJS学习之$q和promise介绍相关推荐

  1. AngularJS学习笔记(一)

    前言 几个月之前了解过一点Angular,主要是通过phonecat应用程序了解一些入门东西,但是当被问及什么是Angular或者你对Angular的理解时,只记得一个MVVM双向数据绑定,显然这是不 ...

  2. angularjs学习总结(资料收集)

    angularjs学习总结(资料收集) 原文地址https://blog.csdn.net/weixin_33178524/article/details/79179597 1 前言 前端技术的发展是 ...

  3. 推荐10个很棒的AngularJS学习指南

    AngularJS 是非常棒的JS框架,能够创建功能强大,动态功能的Web app.AngularJS自2009发布以来,已经广泛应用于Web 开发中.但是对想要学习Angular JS 的人而言,只 ...

  4. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  5. 强化学习之Q学习与SARSA

    ** Q学习路径规划与SARSA法路径规划 ** Q学习与SARSA学习简介 强化学习的历史可以用两条各自独立但丰富多彩的主线来追溯..一条主线聚焦 于研究最优化控制,以及使用价值函数动态规划等算法来 ...

  6. 第七章 深度强化学习-深度Q网络系列1(Deep Q-Networks,DQN)

    获取更多资讯,赶快关注上面的公众号吧! 文章目录 第七章 深度强化学习-深度Q网络 7.1 学习目标 7.2 深度学习和强化学习的区别 7.3 DQN原理 7.4 DQN算法 7.4.1 预处理 7. ...

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

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

  8. 开启AngularJS学习之旅

    AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 可以构建一个单一页面应用程序(SPAs:Single Page Applications). AngularJS 学习起 ...

  9. 我的AngularJS学习轨迹

    开始接触Anguljar可能是在2013年初,那个时候的版本1.0.*,那个时候国内主要的中文资料AngularJS学习笔记:http://zouyesheng.com/angular.html,an ...

最新文章

  1. shell最大出现和连续出现次数_从 1 到 n 整数中 1 出现的次数
  2. 【译】如何精确判断最终用户响应时间过长的原因?
  3. spring+mybatis+springMVC+redis缓存+mysql+bootstrap+异步提交----联系人小demo
  4. mysql主从表结构差异_mysqldiff对比主从表结构是否一致
  5. js实战代码系列—带你玩jQuery带你飞
  6. tdbgrid 数据类型输入错误 vb_VB语言基础(上)
  7. webrtc之onicecandidate的 event handler的一点疑惑
  8. ppt手动放映怎么设置_一键解决PPT的动画播放和动画排序问题!
  9. 硬盘底座linux,微客智品 篇五十二:机械硬盘如何安放?用奥睿科单盘位移动硬盘底座助力新玩法...
  10. php连接mysql字符串函数_mysql 字符串函数
  11. protues8.0仿真视频教程 51单片机教程
  12. 极光:2019年个人网盘行业研究报告
  13. c语言编程矩阵范数,矩阵2范数计算 这个二阶矩阵的二范数怎么
  14. 【Burp suite】intruder内的四种攻击模式(attack type)分析!
  15. error: C99 designator ‘personName’ outside aggregate initializer
  16. 苹果主题商店_苹果tf签名上架需要使用什么材料?
  17. 计组复习-cache
  18. js PhotoSwipe库开源的手机版相册产品的Code.PhotoSwipe.attach方法使用
  19. 【王道笔记-操作系统】第四章 文件管理
  20. 如何一键解决图片无损放大

热门文章

  1. 搞定我的电脑的ALC883声卡Ubuntu驱动
  2. 4000 essential english words推荐学习
  3. 一个虚拟主机怎么建立多个站点?
  4. C语言程序设计第二版呼克佑第一章C语言与程序设计课后习题简答题答案
  5. 计算机软件小白的学习历程
  6. TCP粘包和半包问题及解决
  7. 使用Android-PickerView实现地址选择器时间选择器
  8. 阿里云混合云开放网络生态的探索与实践
  9. excel相乘再相加_(excel 两列相乘再相加)excel表格两列数据乘积
  10. JAVAWEB实现在线预览PDF