angularjs 1.x $q模块使用
什么是$q
$q是angularjs1.x中内置服务,在需要使用时可以注入它。
angular.module('app').controller('myController', function myController($q){
// further operation..
});
为什么使用$q
$q的使用目的是为了提供更好的异步编程解决方案。
来看看$q的api:
$q.defer()
$q.defer执行时返回一个延迟对象(defer)。延迟对象有三种状态: resolve(解决), reject(拒绝), notify(通知)。
同时这三种状态在defer对象下各有一个同名方法,用于改变defer对象的状态值。
一旦状态更改成resolve或reject了,就无法改回来了,这点要注意。
同时,在执行defer.resolve(), defer.reject(), defer.notify()时,可以传入一个参数,这个参数将成为
对应回调函数的参数。看个例子
var defer = $q.defer();
var myPic = new Image(); myPic.onload = function(){
defer.resolve(myPic);
} myPic.onerror = function(){
defer.reject();
} defer.promise.then(function(img){
console.log('download complete');
// 这里可以对参数img进行操作
}, function(reason){
console.log('network error');
}); myPic.src = '/somefile/someimage';
这个例子中,对image的加载做了一些封装。
当图片加载完成或加载失败,会在控制台输出一些提示。
可能在这个例子中,$q发挥的作用并不大,但是放到一些特殊的场景,
它将发挥奇效。
promise
promise(承诺)对象是defer下的属性,它有一些方法处理回调函数,当defer对象的状态变更时,
promise会执行相应的回调。
promise.then(resolveCallback, rejectCallback, notifyCallback)
then方法的三种回调分别对应promise的三种状态的处理。
返回一个promise。也就是说,then方法可以应用链式写法。
注意的是,前面then方法中的resolveCallback的返回值,将会成为后面then方法的resolveCallback的参数。(其他同理)
angular.module('app').controller('myController', function myController($q){
var defer1 = $q.defer();
defer1.promise.then(function resolveCallback(result){
console.log('resolve callback: ' + result);
}, function rejectCallback(reason){
console.log('reject回调不会执行');
}, function notifyCallback(message){
console.log('notify callback: ' + message);
});
defer1.notify('promise got message');
defer1.resolve('promise resolve');
});
// notify callback: promise got message
// resolve callback: promise resolve
nofity不限制调用次数(应用于进度更改通知);
promise.catch(rejectCallback)
catch方法是then方法的一个语法糖,相当于promise.then(null, rejectCallback)。
promise.finally(callback)
在一些旧浏览器,finally是保留字,你可能要这么调用它: promise['finally'](callback)。
$q.reject(value)
返回一个promise。该promise的状态是reject。
也就是说,返回值会马上执行链式操作中的reject的处理方法,如:
$q.reject(reason).then(function(result){
console.log('this would never implement');
}, function(reason){
console.log('promise reject! reason: ' + reason);
});
// or
$q.reject(reason).catch(function(reason){
console.log('reject reason: ' + reason);
});
$q.when(value)
when方法用于封装一个可能是defer对象的值。返回一个promise对象。
如果输入值是promise时,将返回一个promise,当它状态改变时执行后续的链式操作。
如果输入的是一个普通值,也返回一个promise,并且该promise的状态是resolve。换句话说,后面的链式操作会马上跑起来。
你也可以理解为$q.when 和 $q.reject 是一对对应的方法。
$q.all(promises)
all方法用于将多个promise绑定称为单个的promise。
它接受一个promise数组作为参数,返回一个promise对象。
当所有的promise都变成resolve状态时,才会执行回调。
参考:https://www.bennadel.com/blog/2735-q-when-is-the-missing-q-resolve-method-in-angularjs.htm
angularjs 1.x $q模块使用的更多相关文章
- AngularJs 动态加载模块和依赖
最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...
- Angularjs中的$q详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- AngularJS——第9章 模块加载
第9章 模块加载 AngularJS模块可以在被加载和执行之前对其自身进行配置.我们可以在应用的加载阶段配置不同的逻辑. [AngularJS执行流程] 启动阶段(startup) 开始 --> ...
- [AngularJS] “多重路由”嵌套模块——AngularJS“路由”嵌套学习资料教程
这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 1.AngularJS路由嵌套 Angularjs本身自带路由模块,可以满足通过不同 ...
- angularjs中的$q
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- AngularJS的路由、模块、依赖注入
AngularJS的路由在实际应用中更多是由另外封装好的angular-ui-router.js实现的! 为什么不用Ajax而要用前端路由?
- angularjs异步处理 $q.defer()
看别人的项目中有用到 var def = $q.defer()返回一个deferred异步对象def 当代码逻辑遇到 def.resolve(rtns); deferred状态为执行成功,返回rtns ...
- angularjs中使用$q.defer
方法method1和方法method2的区别,我还正在研究中...待添加 代码如下: <html ng-app="myApp"> <head> <ti ...
- angularjs 系列之$q和promise
还是同一个项目,在项目中,发现多个controller之内有一个共同的服务器请求,当时只是不断的重复使用,如今,现在项目结束,代码开始走向了优化迭代的阶段: 首先,我的思路是把这个共同的请求,从con ...
随机推荐
- gdnz
更新yum库:yum updat yum install epel-release 查看是否安装mysql:rpm -qa|grep -i mysql 移除列表mysql :yum remo ...
- 从零构建一个简单的 Python Web框架
为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...
- delphi安装 Tclientsocket, Tserversocket控件
菜单component->Install Packets按Add按钮,选择delphi目录里的bin目录下的dclsockets70.bpl(delphi2010是 dclsockets140. ...
- 三、HTTP抓包测试
package testHTTP; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStrea ...
- 第三方登录 QQ 错误码100044(提示 该应用非官方正版应用)
当你碰到这个问题的时候,不要着急,你的功能已经走通了,代码没有问题. 100044 原因: 1.首先确定你的包名和签名,跟申请第三方平台的是一个.(真心吐槽一下,接盘侠不好当,尤其是没有交接的) 2. ...
- Splinter学习--初探3,两种方式登录QQ邮箱
目前,qq邮箱的登录方式有: 1.利用账号.密码登录 2.快捷登录,前提是你本地已有qq账号登录中 和前面一样,还是先到qq邮箱登录首页,审查页面元素,找到我们进行登录操作所相关的链接.按钮或是输入框 ...
- js实例:验证只能输入数字和一个小数点
分享一个javascript脚本代码,用于验证只能输入数字和一个小数点,检测数字输入是否符合要求,效果不错,有用到的朋友拿去吧. 原文地址:http://www.jbxue.com/article/1 ...
- js常用方法
若未声明,则都是js的方法 1.indexOf indexOf(str):默认返回字符串中第一次出现索引位置 的下标,没有则返回-1 indexOf(str,position):返回从position ...
- [转]protobuf-2.5.0.tar.gz的下载与安装
protobuf-2.5.0.tar.gz的下载与安装 原文地址:http://blog.csdn.net/tdmyl/article/details/31811317 版权声明:本文为博主原创文章, ...
- python学习之路-day6-面向对象
一.面向对象学习 特性 class类 一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性.共同的方法. 面向过程编程和面向对象编程: 面向过程编程:使用一系列的指 ...