JavaScript的ES6语法——Promise对象

  1. Promise的含义

    Promise 是一种异步编程解决方案,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

  2. Promise的三种状态

    pending(进行中)、fulfilled(已成功)和rejected(已失败);

  3. Promise的两个特点

    1. 对象的状态不受外界影响。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

    2. Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected

      只要这两种情况发生,状态就凝固了,不会再改变了,这时就称为 resolved(已定型)。

      [[PromiseStatus]]: "resolved"
      

      如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

  4. Promise的基本用法

    1. Promise对象是一个构造函数,用来生成Promise实例。

      let promise = new Promise(function() {});
      console.log(promise);
      

  1. Promise构造函数必须有一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 JavaScript 引擎提供。

    let promise = new Promise(function(resolve, reject) {
        console.log('aaa');
    });
    console.log(promise);
    

Promise构造函数用一个函数作为参数,作为参数的这个函数也有两个参数,这两个参数也是两个函数——JavaScript引擎提供的函数resolvereject

  1. resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

    let promise = new Promise(function(resolve, reject) {
        console.log('aaa');
        resolve();
    });
    console.log(promise);
    

  1. reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

    let promise = new Promise(function(resolve, reject) {
        console.log('aaa');
        reject();
    });
    console.log(promise);
    

  1. Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

    let promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('aaa');
            resolve();
        }, 3000);
    });
    promise.then(() => {
        console.log('执行成功变为 resolved');
    }, () => {
        console.log('执行失败变为 rejected');
    });
    

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个参数是可选的,这两个函数都接受Promise对象传出的值作为参数。

  1. 注意,调用resolvereject并不会终结 Promise 的参数函数的执行。

    但是,一般来说,调用resolvereject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolvereject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。

    new Promise((resolve, reject) => {
        return resolve(1);
        // 后面的语句不会执行
        console.log(2);
    })
    
  2. Promise.catch()方法:用于指定发生错误时的回调函数。

    相当于then方法不为第一个参数传参,例如then(null, rejection)then(undefined, rejection)方法;

    new Promise(function(resolve, reject) {
        reject(new Error('test'));
    }).catch(function(error) {
        console.log(error);
    });
    

  1. Promise.finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。

    finally方法的回调函数不接受任何参数,所以就没有办法知道,前面的 Promise 是否执行成功。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。

    new Promise(function(resolve, reject) {
        resolve();
    }).finally(() => {
        console.log(111);
    });
    new Promise(function(resolve, reject) {
        reject();
    }).finally(() => {
        console.log(111);
    });
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值