本文只是针对对
Promise
有必定掌握的人士,列举了Promise须要记住和掌握的关键点,不是讲Promise的基础知识。若是是学习Promise,请移步
阮一峰老师的博客。
Promise新建后会当即执行,同步的,可是resolved和rejected的回调函数是异步的, 可是它的回调是放在本轮循环的末尾执行,并非放到下次事件循环中执行。
- pending (进行中)
- fulfilled (已成功)
- rejected (已失败)
三种状态只能是由pending到fulfilled,或由pending到rejected。状态一旦改变,不会再变。 在状态改变后再添加回调函数仍能当即获得结果,这是与事件的区别,事件结束再去监听,是得不到结果的。
- 参数会传递给then回调函数
- 和rejected都不会终止后续代码执行,resolved后面的代码仍会执行,除非在resolved时return
- 当resolved的参数是一个promise实例时,会等待上一个promise的状态返回
- 参数传递给回调函数
- 参数一般是Error对象的实例
- 运行抛出异常,状态也会变为Rejected
- 不只状态变为rejected时会触发,运行中抛出的错误也会被catch捕获
- resolve以后抛出的异常,不会被捕获,状态只会更改一次,更改后就不会改变。
- “冒泡”性质,一直向后传递,直到被捕获。也就是说错误确定会被后面的catch捕获。
- 若是不写catch,promise有错误时,不会有任何反应,不会退出进程、终止脚本执行,promise和外部代码“隔离”(将来可能更改这规则)
- 后面能够继续跟then和catch
- 返回一个resolved状态的promise对象,因此若是抛出一个错误,只会触发第一个catch
- 返回的是一个新的promise对象,不是原来的
- 不推荐传rejected回调函数,这样没法捕获resolved回调函数中的错误
- 若是函数中返回的是一个promise,则后面的then会等待这个promise的结果
finally方法用于指定无论 Promise 对象最后状态如何,都会执行的操做。
与状态无关的,resolved或rejected了都会触发finally(底层也是这么实现的); 但若是promise没有返回resolved或rejected是不会执行的。
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。es6
- 自动把包装的实例转化成promise实例
- 包装的promise实例都resolved了它就resolved
- 有一个rejected,它就rejected
- 若是容器中的实例有本身的catch,则不会触发all的catch
由于catch返回是一个新的promise,catch已经处理了错误,返回的promise是resolved的,因此对all来讲是两个resolved的实例
和all相似,只是它是有一个实例率先改变状态了,它的状态就改变了。
把对象转换成promise对象
参数是一个 Promise 实例 promise
原封不动地返回这个实例。
参数是一个thenable对象异步
thenable对象指的是具备then方法的对象,好比下面这个对象。
let thenable = { then: function(resolve, reject) { resolve(42); } };
resolve会当即执行then方法,而后返回一个resolved的promise对象函数
参数不是具备then方法的对象,或根本就不是对象学习
返回一个状态是resolved的promise对象
不带有任何参数code
直接返回一个resolved状态的 Promise 对象。(注意promise回调的执行时机)
返回一个状态为rejected的promise对象
Promise.reject()方法的参数,会原封不动地做为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致
这个有须要一些技术储备,后续补充。对象