異步操做是 JavaScript 編程的麻煩事,麻煩到一直有人提出各類各樣的方案,試圖解決這個問題。從最先的回調函數,到 Promise 對象,再到 Generator 函數,每次都有所改進,但又讓人以爲不完全。它們都有額外的複雜性,都須要理解抽象的底層運行機制。異步I/O不就是讀取一個文件嗎,幹嗎要搞得這麼複雜?異步編程的最高境界,就是根本不用關心它是否是異步。async 函數就是隧道盡頭的亮光,不少人認爲它是異步操做的終極解決方案。--阮老師的博客
async 表示這是一個async函數,await只能用在這個函數裏面。編程
await 表示在這裏等待promise返回結果了,再繼續執行。promise
await 後面跟着的應該是一個promise對象(固然,其餘返回值也不要緊,只是會當即執行,不過那樣就沒有意義了…)異步
function waitAMinute(time) {
return new Promise(resolve=>{
setTimeout(()=>{
resolve(20)
}, time)
})async
async function test() {
console.log('hello world')
console.log(await waitAMinute(2000)) //兩秒鐘後輸出20
console.log('welcome')
}異步編程
test(); //hello world , 20, welcome函數
let start = function() {
return new Promise(resolve=>{
setTimeout(()=>{
resolve('HelloWorld')
})
})
}code
let end = async function() {
let result = await start()
console.log(result) //獲取結果HelloWorld
}
end()對象
既然then沒必要寫了,那麼.catch()也不須要寫了,直接將await代碼放入try/catch異常處理塊兒當中ip
let end = async function() {
try {
let result = await start()
console.log(result)
} catch(error) {
throw new Error(err.message)
}
}回調函數
[...].forEach(function(value,index){ console.log('當前是第'+ index +'次調用') var result = await start() //報錯 })