什么是$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模块使用的更多相关文章

  1. AngularJs 动态加载模块和依赖

    最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...

  2. Angularjs中的$q详解

    先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...

  3. AngularJS——第9章 模块加载

    第9章 模块加载 AngularJS模块可以在被加载和执行之前对其自身进行配置.我们可以在应用的加载阶段配置不同的逻辑. [AngularJS执行流程] 启动阶段(startup) 开始 --> ...

  4. [AngularJS] “多重路由”嵌套模块——AngularJS“路由”嵌套学习资料教程

    这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 1.AngularJS路由嵌套 Angularjs本身自带路由模块,可以满足通过不同 ...

  5. angularjs中的$q

    先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...

  6. AngularJS的路由、模块、依赖注入

    AngularJS的路由在实际应用中更多是由另外封装好的angular-ui-router.js实现的! 为什么不用Ajax而要用前端路由?

  7. angularjs异步处理 $q.defer()

    看别人的项目中有用到 var def = $q.defer()返回一个deferred异步对象def 当代码逻辑遇到 def.resolve(rtns); deferred状态为执行成功,返回rtns ...

  8. angularjs中使用$q.defer

    方法method1和方法method2的区别,我还正在研究中...待添加 代码如下: <html ng-app="myApp"> <head> <ti ...

  9. angularjs 系列之$q和promise

    还是同一个项目,在项目中,发现多个controller之内有一个共同的服务器请求,当时只是不断的重复使用,如今,现在项目结束,代码开始走向了优化迭代的阶段: 首先,我的思路是把这个共同的请求,从con ...

随机推荐

  1. CSS3 结构伪类选择器 详解

    1 CSS3 结构伪类选择器 1.E:root 匹配E元素所在的根元素 即:html 2. E:nth-child(n) (1)匹配E元素的父元素中第n个子元素,(2)且该位置的子元素类型必须是E类型 ...

  2. ios -网络加载json和本地加载json

    1网络加载json的时候,要在模型的实现文件里写: - (void)setValue:(id)value forKey:(NSString *)key { } 2本地加载json的时候,要在模型的实现 ...

  3. angular+ionic返回上一页并刷新

    假定当前页面为editCata页面,要返回的是cataDetail页面.目前我找到两种方法实现返回上一页并刷新,如果以后有其它方法,再继续添加. 1.在editCataCtrl.js中注入$ionic ...

  4. VScode常用几个前端插件live HTML previewer和debugger for chrome的配置

    之前一直都是用sublime Text和chrome配合来写前端的页面,自从知道了有liveReload这个神奇的插件之后感觉爽翻了啊.好吧跑远了........ 话说最近微软搞了个VScode,听说 ...

  5. 《锋利的jQuery》(第2版)读书笔记4

    第9章 jQuery Mobile jQuery Mobile是用来填补jQuery在移动设备应用上的缺憾的一个新项目. 它基于jQuery框架并使用HTML5和CSS3这些新的技术,除了能提供很多基 ...

  6. MVC后台数据赋值给前端JS对象

    Controller中的数据,不管是使用的是ViewModel 还是ViewBag.Data,要将他传递到View中,这个很容易,但是如果要将它传递给JS中的某个对象,这个改如何处理呢? 后台的数据格 ...

  7. Ant: Class not found: javac1.8

    今天用ant,在选择build.xml,run as ant build后出错Ant: Class not found: javac1.8 分析问题:是否是eclipse中的ant版本和java的版本 ...

  8. 介绍几个 window 下面的terminal

    1. putty 配合 winscp 这个是标配 但是如果开多个ssh连接,管理起来很是不方便. 2. MTputty ,如果要管理多态机器,那么这个工具就是相当给力. 可以连接多个Tab,配置和保存 ...

  9. MySQL 性能优化的最佳20多条经验分享

    当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这 ...

  10. Thinkphp Exception捕获异常失败

    try catch 比较坑,默认这样是走TP 的错误模板页面 自定义的话: try { } catch ( \Exception $e ) {}加个\