Promise()
.then() 得到promise内部执行任务的成功结果
.catch() 得到promise内部执行任务的失败的结果
.finally() 成功与否都会执行,在项目中我们基于axios发送请求时,一般会开启loading,这时可以通过finally,不管请求成功与否,关闭loading,而不需要在成功和失败时写两次关闭loading代码
function fun1(){
return new Promise(function (resolve, reject) {
setTimeout(() => {
let age = Math.random() * 50
if (age > 18) {
resolve(18)
} else {
reject('未成年')
}
}, 2000)
})
}
function fun2(){
return new Promise(function (resolve, reject) {
setTimeout(() => {
let age = Math.random() * 18
if (age > 12) {
resolve(12)
} else {
reject('小学生')
}
}, 2000)
})
}
function fun3(){
return new Promise(function (resolve, reject) {
setTimeout(() => {
let age = Math.random() * 12
if (age > 6) {
resolve(6)
} else {
reject('幼儿园')
}
}, 2000)
})
}
//成功 执行顺序:fun1(成功) -> fun2(成功) -> fun3(成功)
fun1().then(function(res1){
console.log(res1)
return fun2()
}).then(function(res2){
console.log(res2)
return fun3()
}).then(function(res3){
console.log(res3)
})
//失败
.catch(function(err1){
console.log(err1)
return fun2()
}).catch(function (err2) {
console.log(err2)
return fun3()
}).catch(function(err3){
console.log(err3)
})
扩展 :async await
async / await 是基于promise实现的,不能用于普通的函数,
其实就是一种语法糖,async函数就是把promise做了一个包装,await返回值是一个promise对象,它只是把await后面的代码放到了promise.then(),
它使异步代码看起来更像同步代码
async / await与promise一样,是非阻塞的
async init(){
let res = await getJson()
}
// 可以让try/catch可以同时处理同步和异步错误。
//例如:调用fun1 , 使用fun1的返回结果去调用fun2,然后使用两者的结果去调用fun3
const request = () =>{
return fun1().then(res1=>{
return fun2(res1).then(res2=>{
return fun3(res1,res2)
})
})
}
const request = async()=>{
const res1 = await fun1()
const res2 = await fun2(res1)
return await promise( res1 , res2 )
}