2017年7月10日 星期一

Async/Await in React

  • 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)
  }
}


沒有留言:

張貼留言