$q的基本用法

function fn() {
var defer = $q.defer();
setTimeout(function () {
console.log(1);
defer.resolve(6);
}, 2000);
return defer.promise;
} fn().then(function (data) {
console.log(data); //2000ms后打印6
}).catch(function (err) {
console.error(err);
});
//或者用$q.when(fn()), 和上面是同样的效果
$q.when(fn()).then(function (data) {
console.log(data);
}).catch(function (err) {
console.error(err);
});

$q多个promise串行

function f1() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve(1);
}, 2000);
return defer.promise;
} function f2() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve(2);
}, 2000);
return defer.promise;
} function f3() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve(3);
}, 2000);
return defer.promise;
} //f1进行完,在进行f2,然后进行f3,后一个程序等待前一个完成
f1().then(function (data) {
console.log(data); // 2s后打印1
return f2();
}).then(function (data) {
console.log(data); // 再过2s后打印2
return f3();
}).then(function (data) {
console.log(data);  // 再过2s后打印3
});

$q.all

$q.all是用于执行多个异步任务进行回调,它可以接受一个promise的数组,或是promise的hash(object)。任何一个promise失败,都会导致整个任务的失败。

$q.all中接收多个promise是同时进行的。

例1:接受一个promise的hash(object):

<!DOCTYPE html>
<html ng-app="app">
<head>
<title></title>
<script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>
<body>
<div ng-controller="ctrl1">
</div>
<script>
var app = angular.module('app',[]);
app.controller('ctrl1',['$scope','$q',function($scope,$q){
var deferA = $q.defer();
setTimeout(function(){
deferA.resolve('this is DATA A')
},500);
var deferB = $q.defer();
setTimeout(function(){
deferB.resolve('this is DATA B');
},1000);
var p=$q.all({
dataA:deferA.promise,
dataB:deferB.promise
})
p.then(function(result){
console.log(result.dataA); // this is DATA A
console.log(result.dataB); // this is DATA B
})
.catch(function(error){
console.error(error);
})
}]) </script>
</body>
</html>

例2:接受一个promise数组:

<!DOCTYPE html>
<html ng-app="app">
<head>
<title></title>
<script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>
<body>
<div ng-controller="ctrl1">
</div>
<script>
var app = angular.module('app',[]);
app.controller('ctrl1',['$scope','$q',function($scope,$q){
var deferA = $q.defer();
setTimeout(function(){
deferA.resolve('this is DATA A')
},500);
var deferB = $q.defer();
setTimeout(function(){
deferB.resolve('this is DATA B');
},1000);
var p=$q.all([
deferA.promise,
deferB.promise
]);
p.then(function(result){
console.log(result[0]); // this is DATA A
console.log(result[1]); // this is DATA B
})
.catch(function(error){
console.error(error);
})
}]) </script>
</body>
</html>

参考:http://blog.csdn.net/shidaping/article/details/52398925

angular中$q用法, $q多个promise串行/同步/等待), $q.all用法,使用的更多相关文章

  1. 任意promise串行执行算法 - 童彪

      // 任意promise串行执行算法 - 童彪 function runAllPromise() { var p1 = new Promise((resove, reject) => { s ...

  2. Promise的并行和串行

    Promise 并行 这个功能Promise自身已经提供,不是本文的重点.主要是依赖Promise.all和Promise.race. Promise.all是所有的Promise执行完毕后(reje ...

  3. 设 $y_1(x), y_2(x)$ 是 $y''+p(x)y'+q(x)y=0$ 的两个解 ($p(x), q(x)$ 连续), 且 $y_1(x_0)=y_2(x_0)=0$, $y_1(x)\not\equiv 0$. 试证: $y_1(x)$, $y_2(x)$ 线性相关.

    设 $y_1(x), y_2(x)$ 是 $y''+p(x)y'+q(x)y=0$ 的两个解 ($p(x), q(x)$ 连续), 且 $y_1(x_0)=y_2(x_0)=0$, $y_1(x)\n ...

  4. vue使用技巧:Promise + async + await 解决组件间串行编程问题

    业务场景描述 大家都通过互联网投递过简历,比如在智联.58.猎聘等平台.投递心仪的职位前一般都需要前提创建一份简历,简历编辑界面常规的布局最上面是用户的个人基本信息,如姓名.性别.年龄.名族等,接着是 ...

  5. JavaScript 循环数组的时候调用方法中包含Promise的时候如何做到串行

    forEach是不能阻塞的, 默认[并行]方式 const list = [1, 2, 3] const square = num => { return new Promise((resolv ...

  6. promise在angular中的基本使用

    promise在angular中的基本使用 <!DOCTYPE html> <html ng-app="myApp"> <head> <m ...

  7. Angular JS 学习笔记(自定义服务:factory,Promise 模式异步请求查询:$http,过滤器用法filter,指令:directive)

    刚学没多久,作了一个小项目APP,微信企业号开发与微信服务号的开发,使用的是AngularJS开发,目前项目1.0版本已经完结,但是项目纯粹为了赶工,并没有发挥AngularJS的最大作用,这几天项目 ...

  8. Miniprofiler在swagger、vue、angular中的使用

     本篇分为以下几个部分: 1.Swagger的简单应用 2.Miniprofier的后台配置 3.跨域配置 4.在angular中显示Miniprofier 5.在vue中显示Miniprofier ...

  9. angular 2+ 变化检测系列三(Zone.js在Angular中的应用)

    在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...

随机推荐

  1. GeoMesa-单机搭建

    系统安装 CentOS部署 新建虚拟电脑 类型:Linux 版本:Red Hat(64-bit) 创建虚拟硬盘 [x] 动态分配(磁盘占用较小) [ ] 固定大小(使用起来较快) 安装设置(设置roo ...

  2. Scheme实现数字电路仿真(3)——模块

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/12242650.html 作者:窗户 ...

  3. C++走向远洋——65(十五周、项目一)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. 使用HtmlAgilityPack和ScrapySharp抓取网页数据遇到的几个问题解决方法——格式编码问题

    需要用到对应市区县街道居委会的区域编码,于是找到统计局的网页,对这些数据进行抓取,用到了HtmlAgilityPack和ScrapySharp,由于也是第一次从网页抓取数据,所以对于HtmlAgili ...

  5. LeetCode---二叉树3-总结例题

    二叉树-总结例题 1-从中序与后序遍历序列构造二叉树 给定二叉树的后序遍历和二叉树的中序遍历 想法: 先根据后序遍历的最后一个元素构造根节点 寻找根节点在中序遍历中的位置 递归构建根节点的左右子树 / ...

  6. WebAPI-处理架构

    带着问题去思考,大家好! 问题1:HTTP请求和返回相应的HTTP响应信息之间发生了什么? 1:首先是最底层,托管层,位于WebAPI和底层HTTP栈之间 2:其次是 消息处理程序管道层,这里比如日志 ...

  7. XXE学习(二)——DTD基础

    一.DTD简介 文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. 有了DTD文档后,xml就需按照DTD中的规范来书写 DTD 可被成行地声明于 XML ...

  8. c语言之学生管理系统

    0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...

  9. ubuntu下载eclipse详细步骤

    1.官网下载 Eclipse IDE for Java EE Developers: https://www.eclipse.org/downloads/packages/ 2.安装eclipse将其 ...

  10. SpringBoot突报java.lang.NoSuchFieldError分析

    SpringBoot项目,引了一个内部的工具包,竟然导致启动失败,报找不到freemarker Configuration类的一个属性,网上的解法都大同小异,最终用了自己的办法解决,花点时间记录下来, ...