基本用法
async函數(shù)返回一個(gè) Promise 對(duì)象,可以使用then方法添加回調(diào)函數(shù)揪垄。當(dāng)函數(shù)執(zhí)行的時(shí)候穷吮,一旦遇到await就會(huì)先返回,等到異步操作完成饥努,再接著執(zhí)行函數(shù)體內(nèi)后面的語句捡鱼。
下面是一個(gè)例子
async function getStockPriceByName(name) {
const symbol = await getStockSymbol(name);
const stockPrice = await getStockPrice(symbol);
return stockPrice;
}
getStockPriceByName('goog').then(function (result) {
console.log(result);
});
上面代碼是一個(gè)獲取股票報(bào)價(jià)的函數(shù),函數(shù)前面的async關(guān)鍵字肪凛,表明該函數(shù)內(nèi)部有異步操作。調(diào)用該函數(shù)時(shí)辽社,會(huì)立即返回一個(gè)Promise對(duì)象伟墙。
下面是另一個(gè)例子,指定多少毫秒后輸出一個(gè)值滴铅。
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
上面代碼指定 50 毫秒以后戳葵,輸出hello world。
由于async函數(shù)返回的是 Promise 對(duì)象汉匙,可以作為await命令的參數(shù)拱烁。所以生蚁,上面的例子也可以寫成下面的形式。
async function timeout(ms) {
await new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
async 函數(shù)有多種使用形式戏自。
// 函數(shù)聲明
async function foo() {}
// 函數(shù)表達(dá)式
const foo = async function () {};
// 對(duì)象的方法
let obj = { async foo() {} };
obj.foo().then(...)
// Class 的方法
class Storage {
constructor() {
this.cachePromise = caches.open('avatars');
}
async getAvatar(name) {
const cache = await this.cachePromise;
return cache.match(`/avatars/${name}.jpg`);
}
}
const storage = new Storage();
storage.getAvatar('jake').then(…);
// 箭頭函數(shù)
const foo = async () => {};