介绍
es6中加入了promise来统一规范异步行为。promise中可以接收两个参数,res代表成功获得异步的值以后运行什么方法,rej代表失败以后运行什么方法。
let timer = new Promise((res,rej)=>{
setTimeout(()=>{
res("promise");
},1000)
})
//直接把方法名传入promise对象即可
function res(val){
console.log(val)
}
promise对象的缺点:
1.创建的时候就会立刻执行;
2.一旦开始就不能停止;
3.必须通过catch返回错误,否则不会弹出错误。
// 这样的写法是错的,因为Promise对象创建的时候就会立即执行
let timer = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("promise");
},1000)
})
promise 在处理多个异步函数执行的时候,有很大的优势,
尤其是他在处理正确和错误的时候,分的特别明确,
他唯一的缺点是当你需要一个队列的时候,你就需要一个then一个then往下写,
非常难受。
这里就为es7中async和await的诞生埋下了伏笔。
let timer1 = function(){
let p = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("我是timer1");
// res必须包含,没有这个东西你的函数触发.then
// 表示成功后返回的内容
res('timer1成功后返回的内容');
},1500)
})
return p;
}
let timer2 = function(){
let p = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("我是timer2");
res('timer2成功后返回的内容');
},500)
})
return p;
}
let timer3 = function(){
let p = new Promise((res,rej)=>{
setTimeout(()=>{
console.log("我是timer3");
res('timer3成功后返回的内容');
},1000)
})
return p;
}
// 单个调用
timer1().then((data)=>{
console.log(data);
})
// 连续调用
timer1().then((data)=>{
console.log(data);
return timer2();
}).then((data)=>{
console.log(data);
return timer3();
}).then((data)=>{
console.log(data);
})
//通过all方法调用 注意 这个方式是并行执行的 无法决定顺序
Promise.all([timer1(), timer2(), timer3()]).then(function(results){
console.log(results);
});
另外这里再介绍两个不太常用的东西:
1.跟then相对的方法,是catch,也可以一个catch接着一个往下写,是一样的。
2.然后all方法,是按照队列里面速度最慢的那个去执行的,
他还有一个race方法,是谁速度快先执行谁,但是还是并行的,无法解决队列的问题。