es7的特性,平時用的不多龟劲,后面應(yīng)該全面使用
async: await的執(zhí)行環(huán)境撰豺, 聲明這個是一個異步調(diào)用的函數(shù)
await: 后面一般跟一個promise(當(dāng)然還有其他情況耻讽,不過一般不提倡), 當(dāng)遇到await的時候洒琢,會使用協(xié)程的機制秧秉,函數(shù)暫時從斷開,去執(zhí)行其他的函數(shù)衰抑,當(dāng)await后面的promise對象為確實狀態(tài)的時候(即resolve rejected)蛤织, 協(xié)程重新從斷開的位置調(diào)用這個函數(shù)夭拌,await返回值是promise的對象攜帶的的數(shù)據(jù)
下面是一個比較有意思的例子
//一個延遲delay時間才 確實狀態(tài)的promise
//如果放在await后面的話台汇,函數(shù)會斷開delay時間,才重新回調(diào)這個函數(shù)啦撮,所以起到sleep的作用
var sleep = (delay) => new Promise((resolve) => setTimeout(() => resolve('promise 數(shù)據(jù)'), delay));
(async () => {
for (var i = 0; i < 5; i++) {
//函數(shù)從這里斷開1s, 直到sleep變成 resolve狀態(tài)的時候才重新調(diào)用
let data = await sleep(1000);
console.log(data); //promise 數(shù)據(jù)
console.log(new Date, i);
}
await sleep();
console.log(new Date, i);
})();
原文的代碼不太友好
var sleep = delay => new Promise(resolve => setTimeout(resolve, delay));
(async () => {
for (var i = 0; i <= 5; i++) {
console.log(new Date, i);
await sleep(1000);
}
})();
還要十分注意的是 只要有一個await后面的promise是reject, 那么async就會中斷汪厨,并且返回這個reject的promise