使用promise挺长时间了。但一直是拿过来就用,没有好好研究过。最近闲来无事,稍微研究下。
promise 翻译过来就是许诺、允诺。可以理解为我承诺事后做什么事。
主要用途
- 用于异步计算
- 可将异步操作队列化,按照期望的顺序进行,返回预期的结果
- 可以在对象之间传递和操作Promise
异步计算
console.log('start')
new Promise(resolve => {
setTimeout(() => {
resolve('hello')
}, 2000)
})
.then(value => {
console.log(value + ' world')
})
上面就是一个简单的异步计算实例
先输出‘start’,两秒后输出‘hello world’
console.log('start')
new Promise(resolve => {
setTimeout(() => {
// resolve('hello')
}, 2000)
})
.then(value => {
console.log(value + ' world')
})
类似上实例,如果注释掉resolve()方法,结果如何?
先输出‘start’,然后两秒后。。。。。 咦?没东西了?
这时候引出promise的状态,它共有
1.Pending:进行中
2.Resolved(Fulfilled):已完成
3.Rejected:已失败
三种状态
new的时候会立刻进入Pending状态,然后当执行到resolve或者reject的时候会改变状态,同时会生成对应的方法,直到遇到.then()或者.catch()后执行。
这就意味着,你也可以
console.log('start')
let p = new Promise(resolve => {
setTimeout(() => {
// resolve('hello')
}, 2000)
})
p.then(val => {
console.log(value + ' world')
})
跟第一个代码块执行的效果一样。
这里有必要说一下,promise理论上可以执行任何异步操作。包括confirm弹框事点击确定取消的事件。new Promise 弹框,点击确定 执行.then(),点击取消 执行.catch()
队列化
所谓队列化,就是链式调用。
类似与jq的链式调用。promise实现链式调用就是通过.then()里return一个新的promise来实现的。
console.log('start');
new Promise((a) => {
setTimeout(() => {
a('hello')
}, 1000)
})
.then(val => {
console.log(val + ' world');
return new Promise(a => {
setTimeout(() => {
a('hello again')
}, 1000)
})
})
.then(val => {
console.log(val);
})
可传递
可传递的属性,在第三个代码块已经写了。哈哈,一不小心就写早了!
更多
此外,promise还有.all()的方法。这个方法就是的作用是将多个promise包装成一个。
Promise.all([p1, p2, p3, ...]).then(arr => {}).catch(error => {})
.all()方法接受一个数组对象最为参数,数组里可以是promise,也可以是其他值,只有是promise才会等待状态改变。当所有子Promise都完成时,这个Promise才完成,返回值是数组。
如果子Promise有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果。
与.all()方法对应的还有.race()方法。
all是等所有的异步操作都执行完了再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。
网友评论