Promise的设计初衷

我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样:

$.ajax({

  success:function(res1){

    //...请求B开始,B依赖A返回的数据

    $.ajax({

      sucess:function(res2){

        //...请求C开始,C依赖B返回的数据

        $.ajax({

          sucess:function(res3){

          }

        });

      }

    });

  }

});

这种写法的不足:

(1)当多个请求层层依赖的话,就会很多层嵌套,代码的可读性会变得很差,也不利于调试,当一个逻辑层修改的时候可能会引起多个层的变化。

(2)如果C依赖于A和B的结果,但A,B彼此独立,按照上边的写法,B也要等A执行完之后才可以执行,消耗了更多的等待时间。

为了避免这种回调函数层层嵌套(回调地狱)的形式,ES6 给出了Promise。

  • Promise对象能使我们更加合理、更加规范的进行异步操作。

下面我们来正式介绍Promise。

(1)Promise的基本用法:

let pro=new Promise(function(resolve,reject){

});

Promise对象是一个全局对象,创建Promise实例的时候,参数是一个匿名函数,其中有两个参数:resolve,reject。

这两个参数均为方法,resolve方法处理一步操作成功后的业务,reject方法处理业务操作失败后的业务。

(2)Promise的三种状态

  • pending:刚刚创建一个Promise实例的时候,表示初始状态。
  • fulfilled:resolve方法调用的时候,表示操作成功。
  • rejected:reject方法调用的时候,表示操作失败

状态的转化只能是:初始态(pending)->成功(fulfilled),或者,初始态(pending) ->失败(rejected) (不能逆向转换,也无法在成功与失败之间转换)

let pro=new Promise(function(resolve,reject){

  //实例化后的状态:pending

  if(成功){

    resolve();    //状态:fulfiled

  }else{

    reject();    //状态 : rejected

  }

});

(3)then()方法

用于绑定处理操作后的处理程序。

pro.then(function(res){

  //操作成功的处理程序

  },function(error){

  //操作失败的处理程序

})

(3)catch()方法

对于操作异常的程序,使用catch()方法。

pro.catch(function(error){

  //操作失败的处理程序

});

当操作层层依赖的时候,Promise的处理方法:

看一个完整的案例:

let pro=new Promise(function(resolve,reject){

  if(true){

    resolve();

  }else{

    reject();

  }

});

//用then处理操作成功,用catch处理操作异常

pro.then(requestA)

  .then(requestB)

  .then(requestC)

  .catch(requestError);

function requestA(){

  console.log('Aok');

  return 'next B';

}

function requestB(res){

  console.log('Aresult:'+res);

  console.log('Bok')

  return 'next C';

}

function requestC(res){

  console.log('Bresult:'+res);

  console.log('Cok')

}

function requestError(){

  console.log('false');

}

//结果:

Aok

Aresult:next B

Bok

Bresult:next C

Cok

可以看出,使用then方法,三个请求不必在层层嵌套。当B依赖A时,我们使用return将A的结果返回,B使用参数接受这个结果

几个重要的方法:

(1)Promise.all()

接受一个数组作为参数,数组的元素是Promise实力对象,当参数中对象的状态全部返回fulfilled的时候,Promise才会返回。

let pro1=new Promise(function(resolve){

  setTimeout(function(){

    resolve('eg1_ok');

  },5000);

});

let pro2=new Promise(function(resolve){

  setTimeout(function(){

    resolve('eg2_ok');

  },2000);

});

Promise.all([pro1,pro2]).then(function(result){

  console.log(result);   //['eg1_ok','eg2_ok']

}) //在等待pro1,pro2都进入fulfilled状态(5000ms)后,promise.all() 才执行。

当我们执行的某个操作需要多个接口返回的数据来支持,而这多个接口又是互不依赖的,这时候我们就可以用Promise.all(),它会在所有的接口都请求成功后才操作。

(2)Promise.race()方法

与Promise.all()的区别在于,所有的参数实例中,只要又一个状态变化(无论成功还是失败),就会执行,其他实例中再发生变化,它也不管了。

let pro1=new Promise(function(resolve){

  setTimeout(function(){

    resolve('eg1_ok');

  },5000);

});

let pro2=new Promise(function(resolve){

  setTimeout(function(){

    reject('eg2_false');

  },2000);

});

Promise.race([pro1,pro2]).then(function(result){

  console.log(result);

}).catch(function(error){

  console.log(error)

});

//eg2_false

_______________

参考:公众号 web前端教程

ES6 - promise对象的更多相关文章

  1. ES6 Promise对象then方法链式调用

    then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...

  2. ES6 Promise 对象

    Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Pro ...

  3. JavaScript ES6 Promise对象

    说明 Node.js中,以异步(Async)回调著称,使用了异步,提高了程序的执行效率,但是,代码可读性较差的. 假如有几个异步操作,后一个操作需要前一个操作的执行完毕之后返回的数据才能执行下去,如果 ...

  4. ES6 Promise对象(七)

    一.Promise介绍1.Promise简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果2.Promise可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函 ...

  5. es6 promise对象

    function next(){ return new Promise( function( resolve, reject ){ var num =7 // Math.floor( Math.ran ...

  6. IE不支持 ES6 Promise 对象的解决方案

    * 引入bluebird.js即可完美解决. /*ie兼容 Promise*/ isIE(); function isIE() { //ie? if ( !! window.ActiveXObject ...

  7. ES6 Promise 全面总结

    转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...

  8. ES6深入学习记录(二)promise对象相关

    1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...

  9. es6中的promise对象

    Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...

  10. ES6的promise对象应该这样用

    ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...

随机推荐

  1. 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue>提示符

    解决思想如下: 1.在grub rescue>提示符处输入ls  即可看到该命令列出了硬盘上的所有分区,找到安装了linux的分区,我的安装在(hd0,msdos8)下,所以我以(hd0,msd ...

  2. Android 签名工具 shell脚本

    signApk.sh #!/bin/bash #$1 signed and unaligned apk #$2 unsigned apk #$3 aligned apk #./signApk.sh t ...

  3. 学习mongo系列(二) 新建数据库,collection ,insert(),save()

    一,新建数据库user:use user 二,查看当前使用的数据库:db 三,查看所有数据库:show dbs 四,删除当前正在使用的数据库:db.dropDatabase() 五,在当前数据库中插入 ...

  4. (六)ICMP、ping

    ping命令是ICMP协议 127.0.0.1 ifconfig -all

  5. windows+linux开发环境 解决laravel blade模板缓存问题

    编码环境windows10 编码IDE:phpstorm 2016.2 PHP框架:laravel5.3 + 代码运行环境:centos7 + nginx 在开发过程中,上传blade模板文件到lin ...

  6. [转载]【基础篇】不为人知的Maya移动坐标轴

    maya 设置轴向1.将整体模型方向调整到与世界坐标系一致.设置具体模型的轴朝向. 操作:选中模型,按住W键,鼠标左键,在弹出的菜单中选择Axis,比较常用的有Set To Ponit.Set To ...

  7. SSM框架学习之高并发秒杀业务--笔记2-- DAO层

    上节中利用Maven创建了项目,并导入了所有的依赖,这节来进行DAO层的设计与开发 第一步,创建数据库和表. 首先分析业务,这个SSM匡济整合案例是做一个商品的秒杀系统,要存储的有:1.待秒杀的商品的 ...

  8. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  9. vm10虚拟机安装Mac OS X10.10教程[转]

    update:http://www.sysprobs.com/vmware-workstation-8-0-8-0-1-unlocker-to-run-mac-os-x-guest-in-window ...

  10. bzoj 3122: [Sdoi2013]随机数生成器

    #include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...