ES6-Promise对象


Promise是什么?

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

从语法上说,Promise 是一个对象(也就是一个容器),里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

为什么需要Promise?

比如我在工作中使用ajax发一个请求A后,成功后拿到数据,我们需要把数据传给请求B,会导致多个请求的嵌套,代码不够直观。

这个时候我们可以选用Promise对象。

基本用法

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

三种状态

  • pending(进行中)
  • fulfilled(已成功)
  • rejected(已失败)

特点

  • 只有异步操作可以决定当前处于的状态,并且任何其他操作无法改变这个状态;
  • 一旦状态改变,就不会在变。
  • 状态改变的过程只可能是:从pending变为fulfilled和从pending变为rejected。如果状态发生上述变化后,此时状态就不会在改变了,这时就称为resolved(已定型)

如何创建实例

const promise = new Promise((resolve, reject) => {
    // do something here ...
    if (success) {
        resolve(value); // fulfilled
    } else {
        reject(error); // rejected
    }
});

 promise.then(function(value) {
      // success
  }, function(error) {
      // failure
  });

resolve()

将Promise对象的状态从pending变为fulfilled,在异步操作成功的时候调用,并将异步操作的结果作为参数传递出去。

reject()

将Promise对象的状态从pending变为rejected,在异步操作的时候调用,并将异步操作报出的错误作为参数传递出去。

then()

可以接收两个回调函数作为参数,分别作为fullFiled状态的回调函数和rejected状态的回调函数。

Promise 中的方法

then()

他的作用上面也有提到,是为Promise实例添加状态改变时的回调函数。

  • 第一个参数是fullfiled状态的回调函数。
  • 第二个参数(可选)是rejected状态的回调函数。

then 方法返回的是一个新的Promise实例。因此可以采用链式写法,即then方法后面再调用一个then方法;采用链式的then可以指定一组按照次序调用的回调函数,

catch()

发生错误的回调函数。

一般不要再then的方法中定义Rejected状态的回调函数,而应总使用catch方法。

catch方法还是返回一个Promise对象

all()

  • 参数

    iterable 必须是一个可迭代对象,如 Array 或 String。

  • 返回值

    一个新的Promise实例。

  • 作用

    用于将多个Promise实例包装成一个新的Promise实例。

如果传入的参数中存在不是Promise实例,则会先调用Promise.resolve,将其转为Promise实例,再进一步处理。

var promises=[2,3,4].map(id =>{
    return getJSON('/post/'+id+".json");
});
Promise.all(promises).then(posts =>{
    //...
}).catch(reason =>{
    //...
})
  • 注意点

    只有p1,p2,p3的状态都变为fullfiled,p状态才能变成fullfiled;此时p1,p2,p3的返回值组成一个数组,传递给p的回调函数

    只要p1,p2,p3有一个被rejected,p的状态就变为rejected;

race()

  • 参数

    iterable 必须是一个可迭代对象,如 Array 或 String。

  • 返回值

    一个新的Promise实例。

  • 作用

    用于将多个Promise实例包装成一个新的Promise实例。

  • 与all()的不同点

    只要p1,p2,p3中有一个实例率先改变状态,p的状态就跟着改变。此时率先改变的Promise实例的返回值就会传递给p的回调函数。

resolve()

  • 返回值

    一个新的Promise实例。

  • 作用

    将现有对象转化为Promise。

  • 参数(有以下四种情况)

    1. 参数是Promise实例,不做任何修改。
    2. 参数是一个thenable对象(指的是具有then方法的对象),会立即执行thenable对象的then方法。
    3. 参数不是第二种或者根本不是对象,返回一个新的Promise对象,状态为Resolved(fullfiled);
    4. 不带任何参数,返回一个新的Promise对象,状态为Resolved。

reject()

  • 作用

    会返回一个新的Promise对象,状态为Rejected。


文章作者: Rabbit
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rabbit !
 上一篇
ES6-Module模板 ES6-Module模板
概述历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有
2020-03-26
下一篇 
关于ES6中的变量的解构赋值的介绍 关于ES6中的变量的解构赋值的介绍
(文章中介绍的都是个人观点,如有不准确的欢迎指出。但请勿喷,谢谢!) 在了解具体内容之前,我们应该带着以下问题来阅读文章。 什么叫做解构?(简单来讲就是从数组和对象中提取值) 解构赋值可以用在哪些数据结构上?(数组、对象、字符串-类似数组、
2020-03-15
  目录