async的ES7的關(guān)鍵字,它的意思是異步,可以單獨(dú)使用
使用方法是放在函數(shù)前面,聲明這是一個(gè)異步函數(shù),等同步代碼執(zhí)行完之后再執(zhí)行它
示例代碼:
async function wo(){
console.log("1233")
}
micr=()=>{
console.log("4566")
}
micr();
wo();
//執(zhí)行結(jié)果 4566 1322
wo();
micr();
//執(zhí)行結(jié)果 1322 4566
此時(shí)的wo()函數(shù)里和mocr()函數(shù)都是同步
如果async 函數(shù)有返回結(jié)果,要在.then()來(lái)承接結(jié)果
async function po(){
return "小楓"
}
po().then(
rem=>{
console.log("rem",rem) //后執(zhí)行
}
)
po();
console.log("po",po()) //先執(zhí)行
// 打印結(jié)果 po Promise <"小楓">
// 打印結(jié)果 "rem",小楓
//此時(shí).then()函數(shù)內(nèi)執(zhí)行的就是異步,在同步之后執(zhí)行
await的意思是等待,等待此函數(shù)執(zhí)行后,再執(zhí)行下一個(gè),可以把異步函數(shù)變成同步來(lái)執(zhí)行,控制函數(shù)的執(zhí)行順序。await一定要搭配async使用。
當(dāng) await 后的函數(shù) 返回的是promise()
f1=()=>{
return new Promise((resolve)=>{
setTimeout(() => {
console.log("周")
resolve(); //這一步必寫,否則會(huì)阻塞在這里
}, 1000);
})
}
f2=()=>{
return new Promise((resolve)=>{
setTimeout(() => {
console.log("震")
resolve();
}, 1000);
})
}
f3=()=>{
return new Promise((resolve)=>{
setTimeout(() => {
console.log("南")
resolve();
}, 1000);
})
}
async function con(){
await f1();
await f2();
await f3();
}
con();
// 打印結(jié)果 每隔1秒輸出一個(gè)字 周 震 南
當(dāng)await 后跟的是普通函數(shù)(非promise())
function H1(){
setTimeout(()=>{
console.log("I ")
},1000)
}
function H2(){
setTimeout(()=>{
console.log("am ")
},1000)
}
function H3(){
setTimeout(()=>{
console.log("fangqianwen ")
},1000)
}
async function Hon(){
await H1();
await H2();
await H3();
}
Hon();
// 打印結(jié)果 隔了一秒后,同時(shí)輸出三個(gè)字 I am fangqianwen
所以await后跟的表達(dá)式不同,有兩種處理結(jié)果
1 對(duì)于promise對(duì)象,await會(huì)阻塞函數(shù)執(zhí)行,等待promise的resolve返回值,作為await的結(jié)果,然后再執(zhí)行下下一個(gè)表達(dá)式
2 對(duì)于非promise對(duì)象,比如箭頭函數(shù),同步表達(dá)式等等,await等待函數(shù)或者直接量的返回,而不是等待其執(zhí)行結(jié)果
let f1=()=>{
return new Promise(
(resolve,reject)=>{
setTimeout(()=>{
console.log("病")
resolve("這是f1")
},1000)
}
)
}
let f2=()=>{
return new Promise(
(resolve,reject)=>{
setTimeout(()=>{
console.log("隙")
resolve("這是f2")
},1000)
}
)
}
let f3=()=>{
return new Promise(
(resolve,reject)=>{
setTimeout(()=>{
console.log("碎")
resolve("這是f3")
},1000)
}
)
}
let f4=()=>{
return new Promise(
(resolve,reject)=>{
setTimeout(()=>{
console.log("筆")
resolve("這是f4")
},1000)
}
)
}
let as=async ()=>{
let str1 = await f1();
let str2 = await f2();
let str3 = await f3();
let str4 = await f4();
console.log(str1,str2,str3,str4)
}
as()

image.png