Node的产生,大大推动了Javascript这门语言在服务端的发展,使得前端人员可以以很低的门槛转向后端开发。 当然,这并不代表迸发成了全栈。全栈的技能很集中,绝不仅仅是前端会写一些HTML和一些交互,后台熟悉数据库的增删查改。
  
  想必接触过Node的人都知道,Node是以异步(Async)回调著称的,其异步性提高了程序的执行效率,但同时也减少了程序的可读性。如果我们有几个异步操作,并且后一个操作需要前一个操作返回的数据才能执行,这样按照Node的一般执行规律,要实现有序的异步操作,通常是一层加一层嵌套下去。 为了解决这个问题,ES6提出了Promise的实现。
  
  含义 Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示。简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。 它的一般表示形式为:
  
  new Promise(
  
  /* executor */
  
  function(resolve, reject) {
  
  if (/* success */) {
  
  // ...执行代码
  
  resolve();
  
  } else { /* fail */
  
  // ...执行代码
  
  reject();
  
  }
  
  }
  
  );
  
  其中,Promise中的参数executor是一个执行器函数,它有两个参数resolve和reject。它内部通常有一些异步操作,如果异步操作成功,则可以调用resolve()来将该实例的状态置为fulfilled,即已完成的,如果一旦失败,可以调用reject()来将该实例的状态置为rejected,即失败的。
  
  我们可以把Promise对象看成是一条工厂的流水线,对于流水线来说,从它的工作职能上看,它只有三种状态,一个是初始状态(刚开机的时候),一个是加工产品成功,一个是加工产品失败(出现了某些故障)。同样对于Promise对象来说,它也有三种状态:
  
  pending:初始状态,也称为未定状态,就是初始化Promise时,调用executor执行器函数后的状态。
  
  fulfilled:完成状态,意味着异步操作成功。
  
  rejected:失败状态,意味着异步操作失败。 它只有两种状态可以转化,即
  
  操作成功:pending -> fulfilled
  
  操作失败:pending -> rejected 并且这个状态转化是单向的,不可逆转,已经确定的状态(fulfilled/rejected)无法转回初始状态(pending)。 方法
  
  Promise.prototype.then()
  
  Promise对象含有then方法,then()调用后返回一个Promise对象,意味着实例化后的Promise对象可以进行链式调用,而且这个then()方法可以接收两个函数,一个是处理成功后的函数,一个是处理错误结果的函数。 如下:
  
  var promise1 = new Promise(function(resolve, reject) {
  
  // 2秒后置为接收状态
  
  setTimeout(function() {
  
  resolve('success');
  
  }, 2000);//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  });//面向1-3年前端人员
  
  //帮助突破技术瓶颈,提升思维能力
  
  promise1.then(function(data) {
  
  console.log(data); // success
  
  }, function(err) {
  
  console.log(err); // 不执行
  
  }).then(function(data) {
  
  // 上一步的then()方法没有返回值
  
  console.log('链式调用:' + data); // 链式调用:undefined
  
  }).then(function(data) {
  
  // ....
  
  });
  
  我们主要关注promise1.then()方法调用后返回的Promise对象的状态,是pending还是fulfilled,或者是rejected?
  
  返回的这个Promise对象的状态主要是根据promise1.then()方法返回的值,大致分为以下几种情况:
  
  如果then()方法中返回了一个参数值,那么返回的Promise将会变成接收状态。
  
  如果then()方法中抛出了一个异常,那么返回的Promise将会变成拒绝状态。
  
  如果then()方法调用resolve()方法,那么返回的Promise将会变成接收状态。
  
  如果then()方法调用reject()方法,那么返回的Promise将会变成拒绝状态。
  
  如果then()方法返回了一个未知状态(pending)的Promise新实例,那么返回的新Promise就是未知状态。
  
  如果then()方法没有明确指定的resolve(data)/reject(data)/return data时,那么返回的新Promise就是接收状态,可以一层一层地往下传递。 转换实例如下:
  
  var promise2 = new Promise(function(resolve, reject) {
  
  // 2秒后置为接收状态
  
  setTimeout(function() {
  
  resolve('success');
  
  }, 2000);
  
  });
  
  promise2
  
  .then(function(data) {
  
  // 上一个then()调用了resolve,置为fulfilled态
  
  console.log('第一个then');
  
  console.log(data);
  
  return '2';
  
  })
  
  .then(function(data) {
  
  // 此时这里的状态也是fulfilled, 因为上一步返回了2
  
  console.log('第二个then');
  
  console.log(data); // 2
  
  return new Promise(function(resolve, reject) {
  
  reject('把状态置为rejected error'); // 返回一个rejected的Promise实例
  
  });
  
  }, function(err) {
  
  // error
  
  })//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  .then(function(data) {
  
  /* 这里不运行 */
  
  console.log('第三个then');
  
  console.log(data);
  
  // ....
  
  }, function(err) {
  
  // error回调
  
  // 此时这里的状态也是fulfilled, 因为上一步使用了reject()来返回值
  
  console.log('出错:'www.mhylpt.com + err); // 出错:把状态置为rejected error
  
  })//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  .then(function(data) {
  
  // 没有明确指定返回值,默认返回fulfilled
  
  console.log('这里是fulfilled态');
  
  });//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  Promise.prototype.catch() catch()方法和then()方法一样,都会返回一个新的Promise对象,它主要用于捕获异步操作时出现的异常。因此,我们通常省略then()方法的第二个参数,把错误处理控制权转交给其后面的catch()函数,如下:
  
  var promise3 = new Promise(function(resolve, reject) {
  
  setTimeout(function() {
  
  reject('reject');
  
  }, 2000);
  
  });
  
  promise3.then(function(data) {
  
  console.log('这里是fulfilled状态'); // 这里不会触发
  
  // ...
  
  }).catch(function(err) {
  
  // 最后的catch()方法可以捕获在这一条Promise链上的异常
  
  console.log('出错:' www.yigouyule2.cn+ err); // 出错:reject
  
  });
  
  Promise.all() Promise.all()接收一个参数,它必须是可以迭代的,比如数组。 它通常用来处理一些并发的异步操作,即它们的结果互不干扰,但是又需要异步执行。它最终只有两种状态:成功或者失败。 它的状态受参数内各个值的状态影响,即里面状态全部为fulfilled时,它才会变成fulfilled,否则变成rejected。 成功调用后返回一个数组,数组的值是有序的,即按照传入参数的数组的值操作后返回的结果。如下:
  
  // 置为fulfilled状态的情况
  
  var arr = [1, 2, 3];
  
  var promises = arr.map(function(e) {
  
  return new Promise(function(resolve, reject) {
  
  resolve(e * 5);
  
  });
  
  });
  
  Promise.all(promises).then(function(data) {
  
  // 有序输出
  
  console.log(data); www.michenggw.com// [5, 10, 15]
  
  console.log(arr); // [1, 2, 3]
  
  });
  
  // 置为rejected状态的情况
  
  var arr = [1, 2, 3];
  
  var promises2 www.gcyl152.com= arr.map(function(e) {
  
  return new Promise(function(resolve, reject) {
  
  if (e === 3) {
  
  reject('rejected');
  
  }//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  resolve(e * 5);//面向1-3年前端人员
  
  });//帮助突破技术瓶颈,提升思维能力
  
  });
  
  Promise.all(promises2).then(function(data) {
  
  // 这里不会执行
  
  console.log(data);
  
  console.log(arr);
  
  }).catch(function(err) {
  
  console.log(err); // rejected
  
  });
  
  Promise.race() Promise.race()和Promise.all()类似,都接收一个可以迭代的参数,但是不同之处是Promise.race()的状态变化不是全部受参数内的状态影响,一旦参数内有一个值的状态发生的改变,那么该Promise的状态就是改变的状态。就跟race单词的字面意思一样,谁跑的快谁赢。如下:
  
  var p1 = new Promise(function(resolve, reject) {
  
  setTimeout(resolve, 300, 'p1 doned');
  
  });
  
  //欢迎加入全栈开发交流圈一起学习交流:864305860
  
  var p2 = new Promise(function(resolve, reject) {
  
  setTimeout(resolve, 50, 'p2 doned');
  
  });
  
  //欢迎加入全栈开发交流圈一起学习交流:864305860
  
  var p3 = new Promise(function(resolve, reject) {
  
  setTimeout(reject, 100, 'p3 rejected');
  
  });
  
  //欢迎加入全栈开发交流圈一起学习交流:864305860
  
  Promise.race([p1, p2, p3]).then(function(data) {
  
  // 显然p2更快,所以状态变成了fulfilled
  
  // 如果p3更快,那么状态就会变成rejected
  
  console.log(data); // p2 doned
  
  }).catch(function(err) {
  
  console.log(err); // 不执行
  
  });
  
  Promise.resolve() Promise.resolve()接受一个参数值,可以是普通的值,具有then()方法的对象和Promise实例。正常情况下,它返回一个Promise对象,状态为fulfilled。但是,当解析时发生错误时,返回的Promise对象将会置为rejected态。如下:
  
  // 参数为普通值
  
  var p4 = Promise.resolve(5);
  
  p4.then(function(data) {
  
  console.log(data); // 5
  
  });
  
  // 参数为含有then(www.dfgjyl.cn)方法的对象
  
  var obj = {
  
  then: function(www.365soke.com/) {
  
  console.log('obj 里面的then()方法');
  
  }
  
  };
  
  var p5 = Promise.resolve(obj);
  
  p5.then(function(data) {
  
  // 这里的值时obj方法里面返回的值
  
  console.log(data); // obj 里面的then()方法
  
  });
  
  // 参数为Promise实例
  
  var p6 = Promise.resolve(7);
  
  var p7 = Promise.resolve(p6);
  
  p7.then(function(data) {
  
  // 这里的值时Promise实例返回的值
  
  console.log(data); // 7
  
  });
  
  // 参数为Promise实例,但参数是rejected态
  
  var p8 = Promise.reject(8);
  
  var p9 = Promise.resolve(p8);
  
  p9.then(function(data) {
  
  // 这里的值时Promise实例返回的值
  
  console.log('fulfilled:'+ data); // 不执行
  
  }).catch(function(err) {
  
  console.log('rejected:' + err); // rejected: 8
  
  });//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  Promise.reject() Promise.reject()和Promise.resolve()正好相反,它接收一个参数值reason,即发生异常的原因。此时返回的Promise对象将会置为rejected态。如下:
  
  var p10 = Promise.reject('手动拒绝');
  
  p10.then(function(data) {
  
  console.log(data); // 这里不会执行,因为是rejected态
  
  }).catch(function(err) {
  
  console.log(err); // 手动拒绝
  
  }).then(function(data) {
  
  // 不受上一级影响
  
  console.log('状态:fulfilled'); // 状态:fulfilled
  
  });//欢迎加入全栈开发交流圈一起学习交流:864305860
  
  除非Promise.then()方法内部抛出异常或者是明确置为rejected态,否则它返回的Promise的状态都是fulfilled态,即完成态,并且它的状态不受它的上一级的状态的影响。 结语
  
  感谢您的观看,如有不足之处,欢迎批评指正。

ES6关于Promise的用法详解的更多相关文章

  1. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  2. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

  3. Vue1.0用法详解

    Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性. 开发环境部署 可参考使用 vue+webpack. 基本用法 1 2 3 ...

  4. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  5. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  6. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  7. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  8. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

随机推荐

  1. 纯js手动分页

    昨天让做个页面,后台提供所有数据,没有做好分页,需要前端js手动分页. 我参考了 http://www.cnblogs.com/jiechn/p/4095029.html 做了些许改动让分页效果更加完 ...

  2. python_面向对象进阶(7)

    第1章 面向对象特性—继承(补充) 1.1 接口类.抽象类介绍 1.2 接口类 1.3 接口类应用过程 1.3.1 第一版:完成多种支付方式接口 1.3.2 第二版: 归一化设计,统一支付方式 1.3 ...

  3. void运算符

    void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但忽略计算结果并返回undefined.由于void会忽略操作数的值,因此在操作数具有副作用的时候使用void来让程序 ...

  4. SEO & HTML语义化

    SEO SEO的概念:搜索引擎优化,常见的搜索引擎有百度.谷歌等.优化的话,就是通过我们的处理,使得我们的网站在搜索引擎下有一个理想的结果. SEO的目的:当用户在搜索引擎上搜索关键词的时候,看到我们 ...

  5. canvas防画图工具

    <style> body {   background: black;   text-align: center; } #cans {   background: white; } < ...

  6. SQLite -创建表

    SQLite -创建表 SQLite CREATE TABLE语句用于创建一个新表在任何给定的数据库.创建一个基本表包括表命名和定义其列,每列的数据类型 语法: CREATE TABLE语句的基本语法 ...

  7. Android(java)学习笔记177: 服务(service)之音乐播放器

    1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...

  8. Vue.js Extension Pack 和 jsconfig.json 可以定位跳转到@开头的路径等自定义路径

    Vue.js Extension Pack | vsCode插件 可以定位跳转到@开头的路径等自定义路径 webpack自定义别名后,VScode路径提示问题 //tsconfig.json 或者 j ...

  9. 深搜DFS

    POJ-1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...

  10. Mybatis 头信息

    在使用IDEA开发中,如果不使用Mybatis-Generator时,那么就需要手写Mapper文件,而在创建xml文件时无法直接创建带有mybatis头信息的mapper文件,这里来记录一下Myba ...