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. struts(三) ---OGNL的学习和理解

    OGNL:Object graphic Navgation Language(对象图形的导航语言)

  2. MongoDB:实体对象(javabean)转DBObject

    代码仅供练习(反射,泛型): package utils; import java.lang.reflect.Field; import com.mongodb.BasicDBObject; impo ...

  3. python——挖装饰器祖坟事件

    装饰器是什么呢? 我们先来打一个比方,我写了一个python的插件,提供给用户使用,但是在使用的过程中我添加了一些功能,可是又不希望用户改变调用的方式,那么该怎么办呢? 这个时候就用到了装饰器.装饰器 ...

  4. codeforces 725D . Contest Balloons(贪心+优先队列)

    题目链接:codeforces 725D . Contest Balloons 先按气球数从大到小排序求出初始名次,并把名次排在第一队前面的队放入优先队列,按w-t-1值从小到大优先,然后依次给气球给 ...

  5. 常见JAVA框架

     Spring Framework [Java开源JEE框架] Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不 ...

  6. Oracle数据库备份与恢复

    第一章. 理解什么是数据库恢复 当 我们使用一个数据库时,总希望数据库的内容是可靠的.正确的,但由于计算机系统的故障(硬件故障.软件故障.网络故障.进程故障和系统故障)影响数据库系 统的操作,影响数据 ...

  7. ASP.NET关于WebPages的一点总结

    相比于早期的ASP,WebPage貌似只是多了一些Razor语法可以直接调用服务器代码,其他的内容HTML.样式CSS以及脚本JavaScript基本都是一样的处理方式 只是说内容HTML里面加入了更 ...

  8. 记录一些容易忘记的属性 -- UINavigationController

    //设置导航栏的风格    self.navigationController.navigationBar.barStyle = UIBarStyleDefault;    //设置导航栏是否透明 N ...

  9. OVM-V1.2 版发布,新增实时监控、支持一键升级

    OVM是国内首款.完全免费.企业级--混合虚拟化管理平台,OVM是从中小企业目前的困境得到启发,完全基于国内企业特点开发,更多的关注国内中小企业用户的产品需求. OVM-V1.2 该版本功能变动如下: ...

  10. 2、Linux系统root用户忘记密码的重置方式

    .界面按空格暂停,按E .找到UTF-,在后面空格后输入init=/bin/sh 然后CHRL+X启动 .进入到这个界面,输入mount -o remount,rw / .输入passwd..然后输入 ...