理解并掌握Promise的用法

前沿: 

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

 

 

Promise知识要点: 

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

  经过Promise构造函数建立promise对象。promise对象是Promise构造函数的一个实例。ajax

var promise1 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

console.log(promise1);
// output: [object Promise]

 

二、promise对象

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

2-一、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方法。promise

  特别提示:服务器

  一、then方法 的 onrejected 处理方法和catch方法只是语法糖不一样。实际上是一个东西。 异步

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

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

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

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

 

 

三、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函数的返回值被忽略。

 

 

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

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

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

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

相关文章
相关标签/搜索