一、什么是promise
解决了回调地狱模式,将异步API的结果作为返回值拿到函数外部。
二、写法
function test(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
if(true){
resolve('成功')//成功执行了某种API后将结果传出去
}else{
reject('失败')//失败后将结果传出去
}
},2000)
})
}
//test()返回一个promise对象
test().then(res=>{
//then里面的回调函数是成功执行的参数,就是上面的成功
//.then前面必须是promise对象
//要是这里return 可以在后面继续.then()
//.tnen()里可以写两个匿名函数,第二个函数就是catch,可以省略下面的.catch()
}).catch(res=>{
//catch里面的回调函数是失败执行的参数,就是上面的失败,没有执行失败这里就不会执行
//.catch前面必须是promise对象
}).then(
//这个.then必须上面return 一个promise对象/或者普通值才能写
//要是return返回一个普通值,这里的res就是返回值,返回普通值上面就会返回一个默认的promise对象和async异步函数会返回一个默认的promise对象一样。
).finally(
//无论成功还是失败都会触发,暂时不是标准。
)
三、async异步函数
将异步代码写成同步的形式,让代码不再有回调的嵌套
写法
async fuction test(){
}
test()//默认返回一个promise对象,
//要是显示的返回一个return 1,这时test.then(res=>{
//res就变成了123
//})
在普通函数test前面加上一个async,test函数就变成了一个异步函数
async异步函数默认的返回值是promise对象
要是显示的return,return后面的值就是.then的参数,return替代了resolve方法。
而throw关键字后面的值,就是.catch()里的参数。
只要执行了其中一个,后面的代码将不会再执行。
四、await
await只能出现在async异步函数中
await后面只能跟promise对象,最后都是async异步函数默认返回的promise对象,不要手动写,然后显示return 一个值。
await可以暂停async异步函数的执行。
写了await后,必须等待后面的promise对象返回结果,后面的代码才能执行。
async function fn(){
return 1
}
async funtion test(){
let a = await fn()//fn()返回的是一个promise对象,因为async异步函数默认的返回值是promise对象,必须等待这个对象执行完后才会执行下面的fn2,照以前fn异步函数会先不执行,先执行fn2(),a就是fn()的执行结果,就是.then()或者.catch的参数。这里用的return是成功执行,是1
fn2()
}
async和await其实就是简写了new promise((res,rej)=>{}),不用每次手动创建一个promise对象。
五、promise对象的方法
1.Promise.all()
处理多个异步任务,所有任务执行完成才能得到结果
Promise.all([接口1,接口2,接口3]).then(res=>{
//res也是一个数组,是这三个接口的返回值
})
2.Promise.race()
并发处理多个异步任务,只要有一个任务完成就能得到结果
Promise.race([接口1,接口2,接口3]).then(res=>{
//race是只要有一个接口成功,就能执行
//res是最快的那个接口的返回值。
//后面接口的返回值不再获取。
})