async声明一个异步函数
1.自动将常规函数转换成Promise,返回值也是一个Promise对象
2.只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
3.异步函数内部可以使用await
await暂停异步的功能执行
1.放置在Promise调用之前,await强制其他代码等待,直到Promise完成并返回结果
2.只能与Promise一起使用,不适合用于回调
3.只能在async函数内部使用
async函数完全可以看作多个异步操作,包装成的一个Promise对象,而await命令就是内部then命令的语法糖
async声明函数
//函数声明
async function foo(){
//do something
}
//函数表达式
const foo = async function(){
//do something
}
//对象方法
let o = {
async foo(){
//do something
}
}
// 箭头函数
const foo = async () => {
// do something
}
await
是async wait的缩写,它等待返回的是一个表达式,不管是不是Promise对象都可以,只是说如果返回的是Promise对象,执行的状态不一样;
await只能在async函数中使用
function sync() {
setTimeout(() => {
return 1
}, 1000)
}
async function async1(){
return new Promise(resolve => {
setTimeout(() => {
resolve(1)
}, 2000)
})
}
async function test(){
await sync() //undefined
console.log(1)
}
关于await的返回值:
1.await后是一个promise对象,如果是resolve状态,值就是resolve参数;如果是reject状态,会将错误抛出
2.await后不是promise对象,则返回值就是该值的本身
注意:
1.容错:考虑await后面的promise运行结果可能是rejected,最好把await放入try{}catch{}中
2.await后的异步操作,如果彼此没有依赖关系最好同时触发
3.await只能在async函数值中,如果在普通函数中会报错
function fn() {
return Promise.reject('error')
}
async function asyncFn() {
try {
await fn()
console.log(1) // 如果上一行出错将直接跳到catch,不会执行到这里
} catch(e) {
console.log(e) // error
}
}
Promise.all([promise1,promise2,promise3......]).then(result=>{}).catch()
用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
接收一个数组作为参数,数组里面可以是Promise对象,也可以是别的值;只有Promise会等待状态改变
result是参数promise数组中所有promise结果组合成的数组
只有当所有子promise都完成,并且结果都是resolve,才走then
只要有一个子promise结果为reject,就走catch,返回值是第一个失败的子promise的结果
Promise.race([promise1,promise2,promise3......]).then(result=>{}).catch()
result为第一个执行成功的promise的resolve结果
只要有一个promise完成就结束了