Promise
1、首先来了解下什么是Promise: 专门保证多个异步任务必须顺序执行,且解决了回调地狱问题的一项特殊技术。之后只要多个异步函数必须顺序执行时,都用Promise代替回调函数。
function one(){
return new Promise(function(resolve,reject){
console.log('one起跑')
setTimeout(function(){
console.log("one到达终点");
resolve();
},4000)
})
}
function two(){
return new Promise(function(resolve,reject){
console.log('two起跑');
const num = Math.random();
if(num<0.2){
setTimeout(function(){
console.log('two到达终点');
resolve();
},2000)
}else{
reject('two摔倒了,退出比赛')
}
})
}
function three(){
return new Promise(function(resolve){
console.log('three起跑');
setTimeout(function(){
console.log('three到达终点')
},2000)
})
}
one().then(two).then(three).catch(function(errMsg){console.log(errMsg)});
2、任务间传参
可以通过resolve传参,resolve(实参);
但是在resolve()中只能接受一个变量,如果传多个变量,也只有第一个变量的值可以传到下一个任务中,那么如果想传多个参数,可以通过数组或对象传参。
3、错误处理
在异步任务中,如果正常执行,通过.then()调用下一个任务, 而如果哪个任务出现了错误,则会直接到.catch(),通过函数接住返回的错误信息。
4、promise 的三个状态
(1)pending (挂起/等待) fulfilled(成功),rejected(失败)
(2)三个状态的切换
a.执行new Promise()时,Promise对象处于pending状态
b. 当执行成功时,我们调用resolve()时,整个promise对象就变成fulfilled状态,就自动调用.then()中的下一项任务。
c.当任务执行过程中出错,我们调用reject()时,整个promise对象就变成rejected状态,就不在调用.then(),而是转向调用结尾的.catch()。
Promise.all
1、当多个异步任务同时执行,但是只有在最后一个任务执行完才做一件事情,则通过使用promise.all来实现。
2、 Promise.all中的返回值是传到 .then()中函数的参数里,即arr中。
3、在arr中接到返回值的顺序和 Promise.all中 异步任务的排序有关,与执行结束的先后顺序无关。
function one(){
return new Promise(function(resolve,reject){
console.log('one起跑')
setTimeout(function(){
console.log("one到达终点");
resolve("one");
},4000)
})
}
function two(num){
return new Promise(function(resolve,reject){
console.log('two起跑');
const num = Math.random();
setTimeout(function(){
console.log('two到达终点');
resolve("two");
},2000)
})
}
function three(num){
return new Promise(function(resolve){
console.log('three起跑');
setTimeout(function(){
console.log('three到达终点')
resolve("three");
},2000)
})
}
Promise.all([one(),two(),three()]).then(function(arr){console.log(arr)})