楔子

最近有些小夥伴在彼此討論時,常常出現一些不太知道原因,但改一改就好了,就隨手做一下筆記也方便提醒自已。

狀況一: 分不清楚有沒有回傳值

functo go1 () {
  return 1
} // 有回傳值

functin go2 () {
  console.log(3)
} // 無回傳值

const go3 = () => 2

const go4 = () => {
  console.log(4)
} // 無回傳值

function addOne (x) {
  return x
}
const go5 = () =>
  addOne(3)

const go6 = () => {
  7
}
const go7 = (x) => ({x})

從上面的問題來看,最直覺的就是要有 return 字眼就是代表有回傳值,所以 go1 go2 很容易判斷。

在 arrow function 中, function 可以直接寫 const go3 = () => 2const go6 = () => {7} 來簡化,但前者有返回值而後者並沒有返回值。

但偏偏又有一個例子 const go7 = (x) => ({x}) 這代表直接返回一個 object ({x})

易發生的 use case

上面的例子最常發生在 .then 的情況下

function getAddOne(x) {
  return new Promise((resolve, reject) => {
    resolve(x + 1)
  })
}

const getAddTwo = (x) => Promise.resolve(x+2)

function getTimesTen(x) {
  return new Promise((resolve, reject) => {
    resolve(x * 10)
  })
}

const getTimesTwenty = (x) => Promise.resolve(2 * x)

function errGetAddOne(x) {
  new Promise((resolve, reject) => {
    resolve(x + 1)
  })
}

getAddOne(10).then(x => getTimesTen(x)) //?
errGetAddOne(10).then(x => getTimesTen(x)) //?

可以試一下上面的 demo code,就會發現所謂的

.then(// do something func).then()

這樣的東西能夠串下去,最重要的是上面要回傳一個 Promise 它才有 .then 的方法

所以在寫 function 時都要想一下這個 function 是只是執行東西不用回拋(eg. 很多主程式就只是做事情而不用回傳)或這個 function 是要回傳計算值的(大部份應該都是這類),要記住哦!