Promise简单来讲就是一个容器,保存着某个将来才会结束得事件(一般为异步操做)得结果。从语法上来说,Promise是一个对象,能够获取异步操做得消息;Promise提供了统一 得API,各类异步操做均可以用一样得方法进行处理。复制代码
一、 Promise对象有两大特色:数组
1)对象得状态不受外界得影响。Promise对象表明一个异步操做。有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态。 2)一旦状态改变,就不会再变,任什么时候候均可以获得这个结果。 Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected 。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。若是改变已经发生了,你再对 Promise 对象添加回调函数,也会当即获得这个结果。这与事件(Event)彻底不一样,事件的特色是,若是你错过了它,再去监听,是得不到结果的。复制代码
2.Promise得缺点:promise
1)没法取消 Promise ,一旦新建它就会当即执行,没法中途取消; 2)若是不设置回调函数, Promise 内部抛出的错误,不会反应到外部。 3)当处于 pending 状态时,没法得知目前进展到哪个阶段(刚刚开始仍是即将完成)。复制代码
3.Promise用法:异步
1)Promise对象是一个构造函数,用来生成Promise实例;ide
const KKBpromise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操做成功 */){ resolve(value); } else { reject(error); } });复制代码
Promise 构造函数接受一个函数做为参数,该函数的两个参数分别是resolve 和reject 。它们是两个函数,由 JavaScript 引擎提供,不用本身部署。函数
resolve 函数的做用是,将 Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操做成功时调用,并将异步操做的结果,做为参数传递出去;reject函数的做用是,将 Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操做失败时调用,并将异步操做报出的错误,做为参数传递出去.code
Promise 实例生成之后,能够用 then方法分别指定resolved状态和 rejected状态的回调函数。 举个栗子:对象
KKBpromise.then(function(value) { // success }, function(error) { // failure });复制代码
then 方法能够接受两个回调函数做为参数。第一个回调函数是Promise对象的状态变为 resolved时调用,第二个回调函数是 Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不必定要提供。这两个函数都接受 Promise 对象传出的值做为参数。事件
function pros(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms, 'done'); }); } pros(100).then((value) => { console.log(value); });复制代码
pros 方法返回一个 Promise 实例,表示一段时间之后才会发生的结果。过了指定的时间( ms 参数)之后, Promise 实例的状态变为 resolved ,就会触发 then 方法绑定的回调函数。ip
2)Promise新建后会当即执行。 举例说明:部署
let promise = new Promise(function(resolve, reject) { console.log('Pro'); resolve(); }); promise.then(function() { console.log('resolved'); }); console.log('Hello Promise!'); // Pro // Hello Promise! // resolved复制代码
Promise 新建后当即执行,因此首先输出的是 Promise 。而后, then 方法指定的回调函数,将在当前脚本全部同步任务执行完才会执行,因此 resolved 最后输出。
有时候在调用 resolve 或 reject 之后,Promise 的使命就完成了,后继操做应该放到 then 方法里面,而不该该直接写在 resolve 或 reject 的后面。因此,最好在它们前面加上 return 语句,这样就不会有意外。
new Promise((resolve, reject) => { return resolve(1); // 后面的语句不会执行 console.log('接着执行'); })复制代码
4.Promise经常使用得API:
1)Promise.all()这个方法返回一个新的promise对象,该promise对象在全部的promise对象都成功的时候才会触发成功,一旦有任何一个里面的promise对象失败则当即触发该promise对象的失败。这个新的promise对象在触发成功状态之后,会把一个包含全部promise返回值的数组做为成功回调的返回值,顺序跟参数的顺序保持一致;若是这个新的promise对象触发了失败状态,它会把第一个触发失败的promise对象的错误信息做为它的失败错误信息。Promise.all方法常被用于处理多个promise对象的状态集合。
let kkb1 = new Promise((resolve, reject) => { resolve('成功了kkb1') }) let kkb2 = new Promise((resolve, reject) => { resolve('成功了kkb2') }) let kkb3 = Promse.reject('失败') Promise.all([kkb1, kkb2]) .then((result) => { console.log(result) //['成功了kkb1', '成功了kkb2'] }) .catch((error) => { console.log(error) }) Promise.all([kkb1,kkb3,kkb2]) .then((result) => { console.log(result) }) .catch((error) => { console.log(error) // '失败' })复制代码
2)Promise.race的使用 race和all用法相似。Promse.race方法顾名思义就是赛跑的意思,意思就是说Promise.race([kkb1, kkb2, kkb3])里面哪一个结果得到的快,就返回那个结果,无论结果自己是成功状态仍是失败状态。
let kkb1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('kkb1') },1000) }) let kkb2 = new Promise((resolve, reject) => { setTimeout(() => { reject('kkb2') }, 500) }) Promise.race([kkb1, kb2]) .then((result) => { console.log(result) }).catch((error) => { console.log(error) // 打印出kkb2 由于它快 })复制代码