前沿: 

  Promise在处理异步操作非常有用。项目中,与后端进行数据请求的时候经常要用到Promise。我们可以用promise + xhr进行ajax的封装。也可以使用基于promise封装的请求方法(fetch)或者类库(axios)去跟服务器进行交互。当使用fethch或者axios的时候,常常需要对数据请求方法进行二次封装。这就要求我们能够理解并掌握promise的用法。

Promise知识要点:

1、首先区分Promise构造函数和promise对象的概念。

  通过Promise构造函数创建promise对象。promise对象是Promise构造函数的一个实例。

var promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
}); console.log(promise1);
// output: [object Promise]

2、promise对象

  概念(有点生硬):promise 对象是一个代理对象(代理一个值),被代理的值在promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。换句话说,promise对象表示一个异步操作的最终状态(完成或失败),以及其返回的值。

2-1、promise的状态类型

a.  一个 promise对象的状态类型:

  • pending: 初始状态,既不是成功,也不是失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

b. promise对象状态改变时,调用的方法。

  要点:pending 状态的 promise 对象可能触发fulfilled 状态并传递一个值给相应的状态处理方法,也可能触发失败状态(rejected)并传递失败信息给相应的状态处理方法。当其中任一种情况出现时,promise 对象的 then 方法绑定的处理方法(handlers )就会被调用。then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。

  当promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当promise状态为rejected时,调用 then 的 onrejected 方法或者catch方法。

  特别提示:

  1、then方法 的 onrejected 处理方法和catch方法只是语法糖不同。其实是一个东西。

2-2. 如何进行链式操作

  要点:Promise.prototype.then 和  Promise.prototype.catch 方法返回promise 对象, 并且将以回调的返回值来resolve。

  1、即然then和catch方法调用后,返回一个新的promise对象(则可以进行链式调用了)。

  2、新的promise对象初始状态为pedding,以回调函数的返回值来resolve(不是reject),则状态变为fulfilled。所以,再进行链式调用的时候是调用 then 的 onfulfilled 方法。(返回值为error或者回调抛出错误,状态会变为rejected???有待考究下。在不发生意外情况,暂且理解为状态只能变为fulfilled)

3、Promise 构造函数

  要点:构造函数主要是用来包装还未支持promises的函数。promise构造函数传入一个带有 resolve 和 reject 两个参数的executor函数。executor函数。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略。

4、promise对象的状态改变时机和值的传递

  我的理解是,只要准确的把握promise的状态变化情况,就能运用好promise。

  1、由Promise构造函数创建的promise对象,状态由Promise构造函数的executor函数去控制promise的状态。调用executor函数的resolve或reject方法,把值传递下去。

  2、当进行链式操作的时候,新的promise对象的状态由上一个then或catch的回调函数去控制promise的状态。用回调函数返回值的形式,把值传递下去。

最新文章

  1. [转] Spring注解@Component、@Repository、@Service、@Controller区别
  2. Visual Studio 2012环境变量、工作目录、vc++目录、 命令等 的配置和作用
  3. C++数学、信号处理相关库
  4. 微信公众平台开发(110) 微信连Wi-Fi
  5. ViewFlipper、ViewPager和Gallery
  6. 既约分数-phi
  7. 一分钟明白 VS manifest 原理
  8. Java Fluent Restful API自动化测试框架
  9. java的Comparator和Comparable
  10. SparseArray HashMap 稀疏数组 二分法
  11. 解决https无法缓存的问题
  12. Oracle拉进sqlserver表声明的建设
  13. lua 变量
  14. Modelsimse10.1如何编译altera库文件以支持IP仿真
  15. 【Beta】Daily Scrum Meeting——Day7
  16. 【learning】[待完善]关于辛普森公式的一点想法
  17. HttpClient的巨坑
  18. [转]angular 禁止缓存
  19. oracle中rownum和rowid的区别【转】
  20. Mysql依赖库Boost的源码安装,linux下boost库的安装

热门文章

  1. 三维视觉惯性SLAM的有效Schmidt-EKF
  2. 菜鸟刷题路:剑指 Offer 06. 从尾到头打印链表
  3. mybatis学习——properties属性实现引用配置文件
  4. centos 7 能ping通但是telnet 22 不通解决方法
  5. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应
  6. SQL server中自定义排序
  7. 微信获取信息发生错误(两个access_token的区别),错误代码:40001,说明:invalid credential, access_token is invalid or not latest hints
  8. Vue项目的开发流程
  9. Spring学习日记01_IOC_xml的三种注入方式
  10. Redis的flushall/flushdb误操作