- Async/Await讓你可以寫出看起來是synchronous但實際上是asynchronous的程式碼
- 每個async function會回傳Promise
- 每個所await的東西將會是Promise
- 這個asynchronous的getUser()回傳一個要花2秒的Promise,這代表我們無法立即取得user物件,而是要等待2秒。
function getUser () {
return new Promise((resolve, reject) => {
setTimeout(() => resolve({name: 'Tyler'}), 2000)
})
}
- 為了要處理這樣的delay,可以傳一個function給Promise的`then( )`,這個function會在Promise resolve時(也就是user物件available時)被呼叫
function handleGetUser () {
getUser()
.then((user) => {
console.log('The user is: ', user)
})
}
- 當Promise chain丟出error時我們可以去catch它
function handleGetUser () {
getUser()
.then((user) => {
console.log('The user is: ', user)
})
.catch((error) => {
console.warn('Oh no there was an error: ', error)
})
}
- 然而如果把上面的code改成synchronous的樣式如下,則無法得到我們想要的結果。user變數只會拿到一個Promise,印出的log也就只是這個Promise。
function handleGetUser () {
var user = getUser()
console.log(user)
}
- 我們可以做點小修改如下,告訴compiler getUser( )是一個asynchronous的function,那麼他就會暫停執行,一直到resolve完成為止,然後才會印出我們真正要的值
function handleGetUser () {
var user = await getUser()
console.log(user)
}
- 不幸的是,上面的code還是不work,因為你不能沒有用async就用了await,所以請記住,如果我要用await,就要確保我所await的function位於async的function中
async function handleGetUser () {
var user = await getUser()
console.log(user)
}
- 至於catch error的部分,直接用JavaScript原本就有的try-catch機制即可
async function handleGetUser () {
try {
var user = await getUser()
console.log(user)
} catch (error) {
console.log('Error in handleGetUser', error)
}
}
沒有留言:
張貼留言