语法
1 |
new Promise(function/* */(resolve, reject) {}); |
Promise构造函数在执行时立即调用executor(executor函数在Promise构造函数返回所建promise实例对象前被调用),executor的返回值会被忽略。
描述
一个Promise对象,其状态只能是pending、resolved或者rejected。当Promise的状态发生变化时,then绑定的handler就会被调用(then方法接受两个参数:onfulfilled和onrejected,但通常情况下,只传onfulfilled)。
属性
- Promise.length: Promise构造函数的参数个数,总是为1。
- Promise.prototype: Promise构造函数的原型对象。
方法
- Promise.all(iterable): 返回一个新的Promise对象,只有iterable里所有的promise成功时才会成功,任何一个promise失败都会触失败。成功时会返回一个数组,每一项对应iterable里的promise的成功返回值。失败时会取第一个失败的promise的错误信息。注意,iterable不仅仅只能是promise,也可以是任意其他值,比如:
1
Promise.all([Promise.resolve(1), 2, 3]).then(resArr => console.log(resArr)); // [1,2,3]
对于所有非thenable的值,都会直接将其resolve;thenable的值,则会根据以运行结果判断。当Promise.all的参数为[]或者空字符串时(或者定义了空的Symbol.iterator的任意值)时,返回一个同步的resolved的promise。如果iterable不包含任何thenable对象,则返回一个异步的resolved的promise(Chrome是例外,会返回一个同步的promise)。
- Promise.race(iterable): 返回一个新的Promise对象,iterable中任意一个成功或者失败都会调用其对应回调。
- Promise.reject(reason): 返回一个失败状态的Promise对象,并将reason传递给对应处理方法。
- Promise.resolve(value): 返回一个状态由value决定的Promise对象。如果value是thenable对象(带then方法的对象),则状态由then方法执行决定;其他情况,则该Promise的状态为fulfilled。
Promise原型
- Promise.prototype.constructor: 指向Promise构造函数。
- Promise.prototype.catch(onRejected): 给当前promise添加一个拒绝回调,返回一个新的Promise对象。如果被调用,新promise以onRejected函数的返回值来进行resolve;如果当前promise状态为fulfilled,则以当前promise的完成结果作为新promise的完成结果。
- Promise.prototype.then(onFulfilled, onRejected): 给当前promise添加成功和拒绝回调,返回一个新的promise。
- Promise.prototype.finally(onFinally): 给当前promise添加回调,并在解析完成之后返回一个新的promise。回调会在当前promise运行完毕后调用,无论状态是fulfilled还是rejected。
拾遗
关于Promise和microtask队列问题:
- 一个promise的then/catch/finally回调函数都是异步的,只有执行完主线程的任务才会开始将回调函数推入microtask队列
- 队列是先进先出
- 只有当主线程空闲的时候,才会开始执行microtask队列
1 |
new Promise(resolve => { |
阅读Promise一种实现的源码
以下是个人的简略解读,可以解释上述现象
1 |
new Promise( |
近期评论