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. 关于F12的有效利用

    1.之前仅用F12查看页面的代码: 2.现在发现用F12可以查看css文件: 3.比如看到页面背景为黑色,然后在css里面把背景从黑色调成白色:

  2. Shell 语法之结构化命令(流程控制)

    许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...

  3. NGUI UIToggle

    NGUI UIToggle 1.add a UI Toggle(Script) and UI Toggle Objects(Script) to a Tab Button(Which has a UI ...

  4. javascript内置属性——arguments

    arguments是javascript中的内置属性,可以直接调用函数的参数,作用类似Array,但本身并不是数组.这次发现它是为了实现封装函数,将不确定数量的数字乘积.比如function mult ...

  5. json 递归查找某个节点

    一段json可能有很多的子节点,需要查询到某一个节点 用到的js是 find-in-json.js 地址是:https://gist.github.com/iwek/3924925 貌似翻|||墙才能 ...

  6. systemctl命令

    systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 ...

  7. Java 并发和多线程(三) 多线程的代价 [转]

    原文链接:http://tutorials.jenkov.com/java-concurrency/costs.html 作者:Jakob Jenkov     翻译:古圣昌        校对:欧振 ...

  8. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  9. python基础教程-第二章-列表和元组

    本章将引入一个新的概念,:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在 一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在python中,最基本的数据结构 ...

  10. 基础篇-Windows消息机制

    1在介绍Windows 消息运行机制之前,首先介绍一下消息的概念: 消息(Message)指的就是Windows 操作系统发给应用程序的一个通告[5],它告诉应用程序某个特定的事件发生了.比如,用户单 ...