上节课我们介绍了Promise
的两大属性以及Promise
的基本工作流程,那么这节课我们来说一说如何来使用Promise
。
Promise API
首先我们先来介绍一下Promise
的一些API
。那么Promise
常见的API
有哪些呢:
Promise
构造函数:Promise(excutor){}
Promise.prototype.then
方法:(onResolved, onRejected) => {}
Promise.prototype.catch
方法:onRejected => {}
Promise.resolve
方法:value => {}
Promise.reject
方法:reason => {}
Promise.all
方法:promises => {}
Promise.race
方法:promises => {}
Promise
构造函数
构造函数是我们最常用的一个API
了,因为不用这个API
我们怎么初始化Promise
对象呢?所以这算是我们必用的一个API
,那么这个API
的结构是什么样子呢:
excutor
函数,(resolve, reject) => {}
这个是Promise
构造函数的参数,而且也是一个函数,可以用箭头函数也可以用匿名函数resolve
函数,value => {}
这是excutor
函数的一个参数,由内部定义,供异步任务成功时调用reject
函数,reason => {}
这是excutor
函数的另一个参数,由内部定义,供异步任务失败时调用
另外还有一点要说明一下:excutor
函数会在Promise
内部立即同步调用,异步任务在excutor
中执行
Promise.prototype.then
方法
这个就是我们在实例化一个Promise
对象之后要调用的then
方法,我们知道then
方法是用来指定回调的,这个方法的结构我们其实也比较熟悉了:
onResolved
函数:value => {}
,这是当我们异步任务成功时调用的函数onRejected
函数:reason => {}
,这是当我们异步任务失败时调用的函数
而且这个方法会返回出一个新的Promise
对象,当然我们并没有接触过,后面我们再对这方面来做相应的介绍。
Promise.prototype.catch
方法
这个方法我们目前还没用过。当然了这个方法也是用来指定回调的,但是这个方法只能指定失败的回调。我们来看一下它的结构:
onRejected
函数:reason => {}
,异步任务失败时的回调函数
我们来演示一下:
let p = new Promise((resolve, reject) => { reject("error"); }); p.catch(reason => console.log(reason));
我们来看这段代码,我们实例化了一个Promise
对象,并且直接执行了reject
函数,那么Promise
对象的状态就会被修改成rejected
,然后我们再调用catch
方法,并打印出我们传入的reason
,我来看一下效果:
控制台中成功打印出了我们传入的reason
其实catch
方法是通过then
方法来做了一个独立的封装,所以说catch
方法也会返回一个新的Promise
对象。
Promise.resolve
方法
这个方法和我们用过很多次的那个Promise
中执行异步任务成功时调用的函数不是同一个函数,这个方法有点特殊,这个方法不属于Promise
的实例对象。那么我们应该也能猜到,这个方法属于Promise
函数对象自身方法,和类的静态方法类似。我们之前说的then
方法以及catch
方法这两个方法都属于Promise
实例对象,和类方法类似,类方法存放在原型对象上供实例对象使用,这里也是一样。而resolve
方法不一样。这个方法是属于Promise
函数自身的,相当于静态方法。
那么这个方法有什么作用呢?我们先来看一下这个结构:value => {}
这个方法可以接收一个参数value
,然后返回一个新的状态为成功或者失败的Promise
对象,我们来演示一下:
let p = Promise.resolve(123); console.log(p);
我们调用Promise.resolve
方法并且声明一个变量p
来接收该方法的返回值,然后打印p
看一下结果:
我们看一下,控制台中打印出了p
是一个Promise
对象,状态是成功的,而且值就是我们传入的值,我上面说过resolve
方法会返回一个状态为成功或者失败的Promise
对象,我们现在生成的是成功的。那么什么时候是失败的呢?
我们这里讲一下:
只要我们在调用Promise.resolve
方法的时候传入的参数不是Promise
对象,那么返回的新的Promise
对象的状态就都是成功的,而且新的Promise
的结果就是我们传入的值。
如果我们在调用Promise.resolve
方法的时候传入的是一个Promise
对象,那么返回的新的Promise
对象的值就是我们传入的Promise
的值,状态也是我们传入的Promise
对象的状态。
我们来演示一下:
let p = Promise.resolve( new Promise( (resolve, reject) => { reject("Error") } ) ); console.log(p);
我们来看一下这段代码,我们在调用Promise.resolve
方法是传入了一个失败的Promise
对象,我们来看一下结果是什么样子:
我们看到控制台输出的是会有个失败的Promise
对象,而且结果值是我们传入的Promise
对象的结果值。但是下面还有一个报错是这么回事呢?因为我们这里有一个失败的Promise
对象,而我们后续也没有指定相应的回调来处理这个失败的情况导致的报错。
以上就是Promise.resolve
方法的介绍
Promise.reject
方法
这个方法和Promise.resolve
方法一样,也相当于静态方法,而且也是用来快速生成一个新的Promise
对象。但是这个方法只能生成状态为失败的Promise
对象。这个方法的结构也很简单,reason => {}
接收reason
参数,该参数是失败的原因,返回一个失败的Promise
对象。而且生成的Promise
对象的结果值就是我们传入的值。
这里要注意的一点是,如果我们传入的是一个Promise
对象,不论传入的这个对象是成功的还是失败的,我们生成的新的Promise
对象都是失败的,而且结果是我们传入的Promise
对象,而不再是Promise
对象的结果值了。
Promise.all
方法
这个方法也相当于静态方法,这个方法的结构也比较简单:
promises => {}
这个方法会接受一个参数,但是这个参数是一个数组,这个数组里面都是Promise
对象,而这个方法的返回结果也是一个Promise
对象,但是返回的Promise
对象的状态就要由这个数组参数来决定了,只有当数组中所有的Promise
对象都是成功的时候,返回的Promise
对象才是成功的,否则返回的Promise
对象就是失败的。
但是如果说数组中所有的Promise
对象都是成功的,那么返回的Promise
对象的结果是什么呢?如果返回的Promise
对象是成功的,那么数组中所有的Promise
的结果会组成一个新的数组,来作为返回的Promise
对象的结果。如果返回的Promise
对象是失败的,那么返回的Promise
对象的结果就是数组中失败的Promise
对象的结果。
我们要注意的一点是,如果是数组中有多个Promise
对象都是失败的,那么返回的Promise
对象的结果是数组中按顺序第一个失败的Promise
对象的结果。
Promise.race
方法
这个方法和Promise.all
方法类似,首先也相当于静态方法,其次结构一样,接受一个数组做参数,数组中都是Promise
对象,并且返回一个新的Promise
对象。
但是呢,这个数组中这么多Promise
对象第一个完成的Promise
对象的状态决定了Promise.race
方法返回的Promise
对象的状态。只要第一个完成的Promise
对象是成功的那么的返回的新的Promise
就是成功的。而且第一个完成的Promise
的结果也就会是返回的Promise
对象的结果。
以上便是我们Promise
中常用的API
Copyright statement:The articles of this site are all original if there is no special explanation, indicate the source please when you reprint.
Link of this article:https://work.lynchow.com/article/apis_of_promise/