首页 > javascript学习 > JavaScript > JavaScript中的Promise对象
2020
07-02

JavaScript中的Promise对象

传统的异步编程解决方案是使用回调函数和事件,Promise是异步编程的一种解决方案。

从语法上来讲,Promise是一个对象,从它可以获取异步操作的消息。ECMAscript6原生提供了Promise对象,在这之前,想要使用Promise,一般会借助于第三方库。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的API接口,各种异步操作都可以用同样的方法进行处理,更加方便简单。

Promise对象有三种状态,分别是pending(进行中)、resolved(已完成)、rejected(已失败),当Promise的状态由pending转变为resolved或rejected时,会执行相应的方法,并且状态一旦改变,就无法再次改变状态,这也是它名字promise(承诺)的由来

Promise对象的缺点

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

Promise实例对象的创建

使用new关键字来调用Promise的构造器来进行实例化从而创建一个promise对象:

var promise = new Promise(function(resolve, reject) {
    异步处理语句
});

Promise构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

then()方法和catch()方法:

then()方法表示等待promise对象的状态由pending发生了改变就立即执行,then()方法包含两个参数方法,分别是已成功resolved的回调和已失败rejected的回调,如:

p = new Promise(
    function(resolve,reject){
        setTimeout(function (){resolve('success');},5000);
    }
);
p.then(function(value){console.log(value);});
5秒控制台会显示'success'

由于then()本身会返回一个新的promise,所以后一个then()针对的永远是一个新的promise,可以链式调用

catch()方法的作用是捕获Promise的错误,与then()的第二个参数rejected回调作用几乎一致。

由于Promise的抛错具有冒泡性质,能够不断传递,所以建议不使用then()的rejected回调,而是在最后使用一个catch()中统一处理这些错误

Promise.then(...).then(...).catch(错误处理)

Promise.resolve()和Promise.reject()方法:用来包装一个现有对象,将其转变为对应状态的Promise对象并返回

Promise.done()方法:用法类似与then(),可以提供resolved和rejected两个回调参数,也可以不提供任何参数,主要作用是在回调链的尾端捕捉前面没有被捕捉到的错误

Promise.finally()方法:接受一个方法作为参数,这个方法不管promise最终的状态是怎样,都一定会被执行

以下方法都是参数为一个Promise实例对象数组的方法,如果有不是Promise的对象,将会先通过Promise.resolve()方法转换:

Promise.all()方法:当所有Promise对象状态都变成resolved时,promise才会变成resolved,但只要有一个变成rejected状态,会立刻变成rejected状态
    var promise = Promise.all( [p1, p2, p3] )
    promise.then(...).catch(...)
    当p1、p2、p3的状态都变成resolved时,promise才会变成resolved,并调用then()的已完成回调,但只要p1、p2、p3有一个变成rejected状态,promise就会立刻变成rejected状态。

Promise.race()方法:参数为Promise对象数组,Promise对象数组中只要有一个改变状态,promise就会立刻变成相同的状态

Promise.any()方法:参数为Promise对象数组,只要所有Promise对象有一个变成resolved,promise就会变成resolved;如果所有实例都变成rejected状态,promise就会变成rejected。
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。