async是Generator函數的語法糖,比起Generator更加具備語義。定義一個Generator函數須要相似於以下方式:ajax
function * test(){
yield 1;
yield 2;
return 3
}
var a = test() //不會執行
a.next();
a.next();
複製代碼
定義async函數只須要:promise
async function test(){
var a = await 1
var b = await 2
return b
}
test().then((res)=>{ // res爲test函數的返回值。可見async會返回一個Promise對象
})
複製代碼
在實際使用中await後面實際上更多的是一個異步函數,例如一個promise對象的操做結果bash
// 模擬接口A
function getA(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
let res = Math.random()
if(res>0.5){
resolve(res)
} else {
reject(res)
}
},2000)
})
}
// 模擬接口B
function getB(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
let res = Math.random()
if(res>0.5){
resolve(res)
} else {
reject(res)
}
},2000)
})
}
async function print(){
let a = await getA().catch((error)=>{
console.log(error)
})
let b = await getB()
return [a,b]
}
print().then((res)=>{
console.log('成功',res)
}).catch((err)=>{
console.log('錯誤',err)
})
複製代碼
上述print函數a變量值須要等到getA執行完畢才能得到。getB須要await getA()執行完畢纔會執行。因此print的執行時間是getA和getB的和。這就是所謂的同步方式執行異步函數。 不過使用同步方式執行異步函數的方式也有侷限性。dom
async function print(){
try{
let a = await getA()
}catch(error){
}
let b = await getB()
return [a,b]
}
複製代碼
async使得異步操做流程更加有序化,在promise中異步
getA()
getB()
複製代碼
雖然getA定義在前面,但卻不必定會先於getB返回值,這樣在實際開發中可能給咱們形成麻煩,由於實際開發中數據是由依賴的和有前後之分的。因此爲了有序化,單純使用promise咱們不得不使用以下相似代碼:async
getA().then(()=>{
return getB()
}).then(()=>{
return getC()
})
...
複製代碼
寫的越多,代碼就不具備可讀性,也不利於調試。使用上述的async+await能夠很爽地寫代碼啦.函數
async function getAsyncData(){
let a = await getA();
let b = await getB()
}
getAsyncData().then(()=>{
})
複製代碼
咱們把異步操做的函數(例如ajax,讀取文件等)定義在async函數內,配合await能夠使得異步操做有序化,即先getA再執行getB.ui