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. jQuery EasyUI教程之datagrid应用(一)

    最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...

  2. consul的安装配置 一centos7环境

    centos7上consul的安装--新手笔记 环境 我用的是centos7, 用的是vmware 一 安装系统后首先要设置ip ifconfig eth0 →查看IP 不过输出的信息多一些 ifco ...

  3. shiro的Helloworld

    package shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePassword ...

  4. 文档批量格式化之word技能

    一.在条目末尾添加# Ctrl + H 然后将 ^p替换为#^p 二.繁体字转换为简体字 在word 审阅-->简转繁(繁转简)都可以相互互转 三.将表格的变成字典或者规则的字符串格式 结合Ex ...

  5. 转:已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    答案: int max(int a,int b){return (a+b+abs(a-b))/2;} 类似的 请定义一个宏,比较两个数a.b的大小,不能使用大于.小于.if语句 答案: #define ...

  6. The import javax.servlet.http.HttpServletRequest cannot be resolved

    Error: The import javax.servlet cannot be resolved The import javax.servlet.http.HttpServletRequest ...

  7. css-九宫格自适应的实现

    高度自适应使用padding 或 padding-bottom + 百分比来实现: 宽度自适应使用width + 百分比来实现. 下面是实现九宫格自适应的代码: <!DOCTYPE html&g ...

  8. JavaScipt 源码解析 数据缓存

    常见的内存泄露的几种情况: 循环引用 JavaScript闭包 DOM插入 一个DOM对象被一个JavaScript对象引用,同时又引用同一个或其他的JavaScript对象,这个DOM对象可能回引发 ...

  9. Java数据库操作

    一.JDBC 1.JDBC Java数据库连接,用于Java程序中实现数据库操作功能,java.sql包中提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口及类. 2. ...

  10. Android 系统ID介绍

    Android上系统ID有很多,本文只介绍常用的ANDROID ID.DEVICE ID.IMEI/MEID.WIFI/BT ADDRESS等几个,本文介绍这些ID的数据格式.长度及一些基本知识. 一 ...