哎,自己的学习能力还是弱了些。
所以去年的时候,在腾讯课堂上买过一个关于promise的课程。当时了解了用法,但是平时并没有去使用promise来进行异步流程控制。
首先来说说什么是promise?
promise就是ES6推出的解决异步流程的一个方案。用来避免Callback Hell。
比如说,我们最为常见的异步场景就是ajax。还记得xhr对象里面open()的第三个参数么? 没错,就是true,false。 用来选择异步/同步。
但是我们有时候会想在获取第一个数据后,再去发起第二个ajax请求(因为我们可能要用到第一个ajax的response)。那么,我们通常的办法就是callback。
上一段jq的代码吧
$.ajax({
url: '......',
success: function (data) {
$.ajax({
// 要在第一个请求成功后才可以执行下一步
url: '......',
success: function (data) {
// ......
}
});
}
});
所以为了解决这个问题,社区推出了promise的方案并被ES6采纳。
当然node7.6已经支持ES7了,ES7采用的是async await的解决方案,这个先暂且不谈。
promise英文意思是承诺,有三个状态:
- pending 未完成呢!
- resolve ok! Victory! 成功了
- reject I’m so so so sorry! 没干成
promise是一个对象,要return new Promise(res, rej)才能去使用.then()和.catch()方法。
其中then()代表成功之后干的事儿。
而catch()代表失败之后干的事儿。
另外值得说明的是,then()里面其实可以放两个function的,第二个function相当于catch。 不过这样看着没catch清晰啊
另外需要说明的就是参数的传递
function promise(){
return new Promise((resolve, reject) => {
resolve('haha')
}).then(function(data){
console.log(data);
return data + 'heihei';
}).then(function(data){
console.log(data);
})
}
// haha
// hahaheihei
从上面的demo可以看出,resolve()里面的数据可以直接抛过来,但是在链式操作的时候,我们需要return data。
另外一点是,我们可以针对不同的情况来选择是resolve还是reject,比如说
function promise(){
return new Promise((resolve, reject) => {
if(10%2){
resolve();
}else{
reject();
}
}).then(function(){
console.log('真淘气');
}).catch(function(){
console.log('顽皮');
})
}
// 顽皮
当然,上面的代码的判断地方可以改写为三元判断符。
另外两个常用的promise方法是promise.all()和promise.race()
这两个方法都是接受一个由promise对象组成的数组作为参数
顾名思义,第一个是all,全部的,也就是说数组里的每一个promise都完成了resolve,那么才算成功,才会走then。
而第二个是race,就竞赛的意思,那么也就是说当数组里只要有一个promise对象完成了resolve(), 那么它就会往下执行了。
这让我想起来的一个面试题,等明天的时候放上来吧。
更新:
http://blog.youkuaiyun.com/qq_35534823/article/details/71520627