Async和await

異步操做是 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函數

獲取返回結果

  • await等待的雖然是promise對象,但沒必要寫.then(..),直接能夠獲得返回值,會直接獲取resolve的執行結果

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)
}
}回調函數

注意

  1. ***await 關鍵字只能用在async function內部,不然會報錯
  2. ***這裏所說的一步函數內部表示必須在改異步函數的執行上下文中才能夠

[...].forEach(function(value,index){ console.log('當前是第'+ index +'次調用') var result = await start() //報錯 })

相關文章
相關標籤/搜索