Promise 有几种状态?
Promise 有什么优缺点?
Promise构造函数是同步仍是异步执行,then呢?
Promise和setTimeout的区别?
如何实现 Promise.all?
如何实现 Promise.finally?es6
1)定义
保存着某个将来才会结束的事件(异步操做)的容器数组
2)特色
(1)对象的状态不受外界影响。三个状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。只有异步操做的结果,能够决定当前状态。
(2)状态只能改变一次,任什么时候候都能获得该结果。两种状态改变的状况:pending->fulfilled、pending->rejected。状态一直保持,给Promise对象添加回调函数,能获得该结果。promise
3)优缺点
(1)能够将异步操做以同步操做的流程表达出来,避免了层层嵌套的回调函数;Promise对象提供统一的接口,是的控制异常操做更加容易。
(2)没法取消Promise,一旦新创建即执行;若不设置回调函数,则Promise内部抛出的异常反应不到外部;pending状态没法得知进展。异步
1)定义
为Promise实例添加状态改变时的回调函数。.then(resolved的回调函数,rejected的回调函数[可选])函数
tips:
then方法返回的是一个新的Promise实例(不是原来的那个Promise实例),所以能够链式,如:.then().then()。
采用链式的then,能够指定一组按照次序执行的回调函数。post
1)定义
then(null, rehection)或.then(undefiend, rejection)的别名,用于指定发生错误时的回调函数。this
tips:
promise对象的错误具备“冒泡”性质,错误一直向后传递,直至被捕获。
promise对象错误不会传递到外层代码,即不一样于try/catch,(报错后不会终止外层代码执行)。prototype
1)定义
不论Promise对象最终状态如何,都会执行的操做(ES2018)。本质上是then方法的特例。
2)特色
不接受任何参数,不影响原Promise的状态。
3)实际应用
post请求loading,在请求结束后不论结果如何都关闭loadingcode
做用:
将多个Promise实例,包装成一个Promise实例。对象
特色:
新Promise对象(p)的状态由Promise实例数组([p1, p2, p3])决定。
当p一、 p二、 p3状态都为fulfilled,p的状态为fulfilled,p一、p二、p3的返回值组成一个数组,传递给p的回调函数。
当p一、 p二、 p3中有一个状态为rejected,p的状态为rejected,第一个被reject的实例的返回值,会传递给p的回调函数。
pending(进行中)、fulfilled(已成功)和rejected(已失败)
能够将异步操做以同步操做的流程表达出来,避免了层层嵌套的回调函数;Promise对象提供统一的接口,是的控制异常操做更加容易。
没法取消Promise,一旦新创建即执行;若不设置回调函数,则Promise内部抛出的异常反应不到外部;pending状态没法得知进展。
构造函数同步执行,then异步执行
setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.then()在本轮“事件循环”结束时执行。
function promiseAll(promises) { return new Promise((resolve, reject) => { let resultCount = 0; let results = new Array(promises.length); for (let i = 0; i < promises.length; i++) { promises[i].then(value => { resultCount++; results[i] = value; if (resultCount === promises.length) { return resolve(results) } }, error => { reject(error) }) } }) } let p1 = new Promise(resolve => resolve('p1')) let p2 = new Promise(resolve => resolve('p2')) let p3 = Promise.reject('p3 error') Promise.all([p1, p2, p3]).then(results => { console.log(results) }).catch(error => { console.log(error) // 'p3 error' }) promiseAll([p1, p2]).then(results => { console.log(results) // ['p1', 'p2'] }).catch(error => { console.log(error) })
Promise.prototype.finally = function (callback) { let P = this.constructor; // 构造函数 console.log(P); return this.then( value => P.resolve(callback()).then(() => value), // resolve reason => P.resolve(callback()).then(() => { throw reason }) // reject ); };