首页 > 代码库 > Promise粗解

Promise粗解

一、Promise含义、作用、特点

Promise含义

  • 异步编程的一种解决方案;
  • 简单来说就是一个容器,里面保存这某个未来才会结束的事件(异步操作)的结果;
  • 从语法上来讲,是一个对象,可以获取异步操作的消息;

Promise作用

  • 可避免回调金字塔式的代码;
  • 优化异步流程;
  • 得到异步流程中的错误;

Promise对象的特点

对象的状态不受外界影响

  • Promise对象代表一个异步操作,用三种状态:pending(进行中)、resolve(已完成)、reject(已失败),只有异步操作的结果,可以决定当前是那种状态,任何其他操作都无法改变这个状态;

一旦状态改变,就不会再变,任何事情都可以得到这个结果;

  • Promise对象的状态改变只有两种可能,从pending到resolve和pending到reject;

二、基本用法

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

生成Promise实例

let promise = new Promise(function(resolve,reject){
        //do something
        if(异步操作成功){
                resolve(value);
        }else{
                reject(error);
        }
});
  • Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,两个参数也是函数,由JavaScript引擎提供,不用自己部署;
  • resolve函数的作用是将Promise对象的状态从pending变成resolve,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
  • reject函数的作用是将Promise对象的状态从pending变成reject,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去;

then方法

  • Promise实例生成后,可以用then方法分别指定resolve状态和reject状态的回调函数
promise.then(function(value){
        //success
},function(error){
        //failed
});
  • then方法可以接受两个回调作为参数,第一个回调函数是Promise对象的状态变为resolve时调动,第二个则是转变为reject时调用,第二个函数可选;
  • then方法返回的是一个新的Promise实例(不是原来的Promise实例),因此可以采用链式写法,即then方法后面再调用另一个then方法;

catch方法

  • catch方法是.then(null,reject)的别名,用于指定发生错误时的回调函数;

Promise.all()方法

  • Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例;
  • 用于多个Promise实例一起运行,都运行完毕返回结果;

Promise.race()方法

  • Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。
  • 用于多个Promise实例一起运行,只要有一个运行完毕就返回结果;

Promise.resolve()

  • 有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用;

Promise.reject()

  • Promise.reject(resson)方法也会返回一个新的Promise实例,该实例的状态为reject;

done()

  • Promise对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为Promise内部的错误不会冒泡到全局)。因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。

finally()

  • finally方法用于指定不管Promise对象最后状态如何,都会执行的操作。它与done方法的最大区别,它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行。

三、代码实例

多个异步操作,相互之间传递数据

let add1 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 1),1000)
    });
};

let add2 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 2),1000)
    });
};

let add3 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 3),1000)
    });
};

let add4 = function (value) {
    return new Promise(function(resolve,reject){
        setTimeout(resolve(value + 4),1000)
    });
};

add1(0)
    .then(function (value) {
        console.log(value);
        return add2(value);
    })
    .then(function (value) {
        console.log(value);
        return add3(value);
    })
    .then(function (value) {
        console.log(value);
        return add4(value);
    })
    .then(function (value) {
        console.log(value);
    })
    .catch(function (error) {
        console.log(error);
    })
------
1
3
6
10
  • 多个异步操作,每个异步操作都需要上一个一步操作的结果,保证每个异步操作都返回一个Promise对象;
  • then方法之后,也要用return传递异步操作的结果;

all()方法和race()方法

  • 大家一起走,全部到达终点就吃饭;
Promise.all([add1(0),add2(0),add3(0),add4(0)])
    .then(function (value) {
        console.log(value);
    })
    .catch(function (error) {
        console.log(error);
    });
------
[ 1, 2, 3, 4 ]
  • 大家一起走,只要一个人到达终点,就开始吃饭;
Promise.race([add1(0),add2(0),add3(0),add4(0)])
    .then(function (value) {
        console.log(value);
    })
    .catch(function (error) {
        console.log(error);
    });
------
1
待续...

Promise粗解