概述

ES6统一了用法,并原生提供了Promise对象。作为对象,Promise有一下两个特点:

  • 对象的状态不受外界影响。
  • 一旦状态改变了就不会在变,也就是说任何时候Promise都只有一种状态。

Promise与callback相比可以避免多个异步嵌套,降低代码复杂性。

Promise 的状态

    let p = new Promise((resolve, reject) => {
        return; //Promise {<pending>}
        //resolve('成功'); //Promise {<fulfilled>: '正确'}
        //reject('失败'); //Promise {<rejected>: '错误'}
    })

Promise详解-LMLPHP

Promise 原型

    //promise 原型
    console.log(Promise.prototype);

Promise详解-LMLPHP

Promise构造函数的原型上的thencatchfinally方法可以进行任务结束后的下一步操作,每个Promise实例也可以使用。

(Promise的then支持链式调用,Promise的then方法会返回一个Promise类型的对象,从而可以继续调用then)

(注意:Promise中出现代码写错误,程序内部会throw Error,程序崩溃,但是这个catch也有捕获的能力,最终出现代码错也不会崩溃。)

(finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。)

p.then(
  function(value) { /* 成功时的代码 */ },
  function(error) { /* 出错时的代码 */ }
).catch((error)=>{
  console.log(error);
  console.log("是失败了");
}).finally(() => {···});;
    let p = new Promise((resolve, reject) => {
        resolve('p成功');
    })

    let p1 = p.then(res => {
        console.log(res);
        return ('p1成功')
    }, err => {
        console.log(err);
    })
    p1.then(res => {
        console.log(res);
    })

Promise详解-LMLPHP

Promise 实例

console.dir(Promise);

Promise详解-LMLPHP

 Promise.all()方法就是检测参数数组内部的所有Promise实例是否成功,若成功,则调用then方法进行处理,否则变为reject状态。

    let p1 = new Promise((resolve, reject) => {
        resolve('正确');
        // reject('错误');
    })
    let p2 = new Promise((resolve, reject) => {
        resolve('正确');
        // reject('错误');
    })

    let promiseAll = Promise.all([p1, p2]);
    promiseAll.then(data => {
        console.log('圆满结束', data);
    }).catch(err => {
        console.log(err);
    })

Promise详解-LMLPHP

Promise.race()方法类似于 抢答,只要Promise实例之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

    let p1 = new Promise((resolve, reject) => {
        // resolve('正确');
        reject('错误');
    })
    let p2 = new Promise((resolve, reject) => {
        resolve('正确');
        // reject('错误');
    })

    let promiseAll = Promise.race([p1, p2]);
    promiseAll.then(data => {
        console.log('圆满结束', data);
    }).catch(err => {
        console.log(err);
    })

Promise详解-LMLPHP

Promise.any()主要是针对只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。

    let p1 = new Promise((resolve, reject) => {
        // resolve('正确');
        reject('错误');
    })
    let p2 = new Promise((resolve, reject) => {
        resolve('正确');
        // reject('错误');
    })

    let promiseAll = Promise.any([p1, p2]);
    promiseAll.then(data => {
        console.log('圆满结束', data);
    }).catch(err => {
        console.log(err);
    })

Promise详解-LMLPHP

Promise.allSettled()方法接受一个数组作为参数,数组的每个成员都是一个 Promise 对象,并返回一个新的 Promise 对象。只有等到参数数组的所有 Promise 对象都发生状态变更(不管是fulfilled还是rejected),返回的 Promise 对象才会发生状态变更。

    let p1 = new Promise((resolve, reject) => {
        // resolve('正确');
        reject('错误');
    })
    let p2 = new Promise((resolve, reject) => {
        resolve('正确');
        // reject('错误');
    })

    let promiseAll = Promise.allSettled([p1, p2]);
    promiseAll.then(data => {
        console.log('圆满结束', data);
    }).catch(err => {
        console.log(err);
    })

Promise详解-LMLPHP

 总结

  • Promise.all() 全成功我成功 失败一个我失败
  • Promise.race() 谁第一个改变状态就是谁的,无论成功或失败
  • Promise.any() 一个成功我成功,全部失败我失败
  • Promise.allSettled() 管你成功或失败,全部都得运行完
09-14 04:41