Promise,是一种异步处理模式。

js代码的函数嵌套会使得程序执行异步代码时很难调试。因为多重嵌套的函数无法确定何时触发回调。

如:

  1. funA(arg1,arg2,function(){
  2. funcB(arg1,arg2,function(){
  3. funcC(arg1,arg2,function(){
  4. xxxx....
  5. })
  6. })
  7. })

如果用Promise这种规范,就使得代码很容易理解。它能帮助开发者以同步的方式编写异步的代码。如

  1. deferABC.resolve(xxx)
  2. .then(funcSuccess(){}
  3. ,funcError(){}
  4. ,funcNotify(){}
  5. );

当resolve内的对象执行成功,就会触发 funcSuccess,如果失败就触发funcError.有点类似这样一种服务:

  1. deferABC.resolve(function(){
  2. Sunccess:funcSuccess,
  3. error:funcError,
  4. notify:funcNotify
  5. })

Promise就是一种对执行结果不确定的一种预先定义。如果成功就执行一套success的处理过程,如果失败,就执行一套error的处理过程,无论成功或失败,都记得通知我执行结果。这样就保证无论成功失败,至少会给出resolve一个明确的答复。

引用网上很经典的例子:

比如,小白在上学时很懒,平时总让舍友带饭,并且事先跟他说好了,如果有韭菜鸡蛋就买这个菜,否则就买西红柿炒鸡蛋;无论买到买不到都要记得带包烟。

  1. 小白让舍友带饭()
  2. .then(韭菜鸡蛋,西红柿炒鸡蛋)
  3. .finally(带包烟)

大致理解了Promise(承诺)这种模式。再理解AnjularJS的$q服务就容易的多了。

q服务是AngularJS中自己封装实现的一种Promise实现。

$q的常用方法:

  • defer() 创建一个deferred对象,这个对象可以执行几个常用的方法,比如resolve,reject,notify等
  • all() 传入Promise的数组,批量执行,返回一个promise对象
  • when() 传入一个不确定的参数,如果符合Promise标准,就返回一个promise对象。

在Promise中,定义了三种状态:等待状态,完成状态,拒绝状态。

关于状态有几个规定:
1 状态的变更是不可逆的
2 等待状态可以变成完成或者拒绝

defer()方法:

其中defer()用于创建一个deferred对象,defer.promise用于返回一个promise对象,来定义then方法。then中有三个参数,分别是成功回调、失败回调、状态变更回调。

all()方法:

这个all()方法,可以把多个primise的数组合并成一个。当所有的promise执行成功后,会执行后面的回调。回调中的参数,是每个promise执行的结果。
当批量的执行某些方法时,就可以使用这个方法。

  1. var funcA = function(){
  2. console.log("funcA");
  3. return "hello,funA";
  4. }
  5. var funcB = function(){
  6. console.log("funcB");
  7. return "hello,funB";
  8. }
  9. $q.all([funcA(),funcB()])
  10. .then(function(result){
  11. console.log(result);
  12. });

执行结果:

  1. funcA
  2. funcB
  3. Array [ "hello,funA", "hello,funB" ]

when()方法:

when方法中可以传入一个参数,这个参数可能是一个值,可能是一个符合promise标准的外部对象。

  1. var funcA = function(){
  2. console.log("funcA");
  3. return "hello,funA";
  4. }
  5. $q.when(funcA())
  6. .then(function(result){
  7. console.log(result);
  8. });

执行结果:

  1. hello,funA

AnjularJS异步编程 Promise和$q的更多相关文章

  1. 简单实现异步编程promise模式

    本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多 ...

  2. 异步编程——promise

    异步编程--promise 定义 Promise是异步编程的一个解决方案,相比传统的解决方法--回调函数,使用Promise更为合理和强大,避免了回调函数之间的层层嵌套,也使得代码结构更为清晰,便于维 ...

  3. 异步编程Promise/Deferred、多线程WebWorker

    长期以来JS都是以单线程的模式运行的,而JS又通常应用在操作用户界面和网络请求这些任务上.操作用户界面时不能进行耗时较长的操作否则会导致界面卡死,而网络请求和动画等就是耗时较长的操作.所以在JS中经常 ...

  4. 简述异步编程&Promise&异步函数

    前言:文章由本人在学习之余总结巩固思路,不足之前还请指出. 一.异步编程 首先我们先简单来回顾一下同步API和异步API的概念 1.同步API:只有当前的API执行完成之前,才会执行下一个API 例: ...

  5. 异步编程promise

    异步编程发展 异步编程经历了 callback.promise.async/await.generator四个阶段,其中promise和async/await使用最为频繁,而generator因为语法 ...

  6. es6异步编程 Promise 讲解 --------各个优点缺点总结

    //引入模块 let fs=require('fs'); //异步读文件方法,但是同步执行 function read(url) { //new Promise 需要传入一个executor 执行器 ...

  7. 你所必须掌握的三种异步编程方法callbacks,listeners,promise

    目录: 前言 Callbacks Listeners Promise 前言 coder都知道,javascript语言运行环境是单线程的,这意味着任何两行代码都不能同时运行.多任务同时进行时,实质上形 ...

  8. angularjs系列之轻松使用$q进行异步编程

    第一部分关于js中的异步编程 异步编程简单的说就是你写了一段代码,但他不会按照你书写代码的顺序立即执行,而是等到程序中发生了某个事件(如用户点击了某个按钮,某个ajax请求得到了响应)才去执行这段代码 ...

  9. JavaScript异步编程 ( 一 )

    1. 异步编程 Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须 ...

随机推荐

  1. mongDB-- 3. 查询操作

    1. 准备工作 (1)启动mongo 进入mongo安装目录的bin/ 目录 , ./mongod (2)启动mongo客户端 ./mongo (3) 查看所有库 show dbs; (4) 切换到l ...

  2. eclipse导入重复的项目、eclipse设置默认注释

  3. TypeError: test() got multiple values for keyword argument 'key'

    原因是: 1.函数调用的最终形式只会调用两个函数.一个list参数和一个dict参数,格式为call(func, list, dict); 2.如果传入参数中有key参数,那么首先key参数(包括扩展 ...

  4. 瀑布流布局——jquery

    首先确定定位,因为.box的宽度是确定的,根据屏幕的宽度来调整.box的列数,所以#content的宽度是随着.box的列数变化而变化的,并且需要保持相对于body居中. 因此需要给#content添 ...

  5. log4cxx

    1.简介 (1)Apache log4cxx当前是由Apache软件基金会进行维护.它是java中著名开源项目Apache log4j在c++中对应的日志框架.它是借助于APR(Apache Port ...

  6. MySQL Binlog Mixed模式记录成Row格式

    背景: 一个简单的主从结构,主的binlog format是Mixed模式,在执行一条简单的导入语句时,通过mysqlbinlog导出发现记录的Binlog全部变成了Row的格式(明明设置的是Mixe ...

  7. java获得汉语首字母

    package org.scbit.lsbi.scp.utils; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefor ...

  8. Java中String,StringBuffer与StringBuilder的差别

    String 字符串常量: StringBuffer 字符串变量〈缓冲区〉(线程安全): StringBuilder 字符串变量〈缓冲区〉(非线程安全): 简要的说, String 类型和 Strin ...

  9. vs2008所有DTE.ExecuteCommand命令

    下面列表中为我当前机器上visual studio 2008所有DTE.ExecuteCommand命令的内容: 其中:Build.开头对应“编译”菜单下命令(如:Build.RebuildSolut ...

  10. scala中的面向对象定义类,构造函数,继承

    我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...