ES6 Promise-2

Demo of how to chain Promise

by Po-Jung Chen

JavaScript

/**
 * Promise 使用 .then 串接
 * 在 .then 裡面 revole(value) 的 value 一樣是 promise 物件,
 * 可以被傳到下一個 .then 中使用。
 **/

const chainPromise = new Promise((resolve, reject) => {
  console.log('In new Promise, start callback') // 立即執行
  setTimeout(() => {
    let data = 10
    resolve(data) // 1 秒後執行
  }, 1000)
})

// 在 .then 裡面在 return resolve 的 value
// 這個新的 value 會被傳到下一個 promise 的 resolver 內
chainPromise.then((value) => {
    console.log('first .then') // 被 resolve 後執行
    return value + 3
  })
  .then((value) => {
    // 得到上一個 .then return 的值後執行
    console.log('second .then')
    console.log('The final value is ' + value)
  })



/**
 * EXAMPLE1: 在 Promise 的 callback 中回傳另一個 Promise
 **/

const returnPromise = new Promise((resolve, reject) => {
  // 立即執行
  console.log('In first Promise, start callback')
  setTimeout(() => {
    let data = 10
    resolve(data) // 2 秒後執行
    console.log('In fist Promise, resovle data')
  }, 1500)
})

// 當前面 Promise 的 resolve 得到內容後,才會執行 .then
returnPromise.then((value) => {
  // 在.then 的 resolvedCallback 中,可以得到在 new Promise 中 resolve 內所得到的值(value)。
  console.log('In first then, the value is ' + value)
  // 如果在 .then 的 resolvedCallback 中 return 一個值,則這個值會以 Promise 物件的形式傳到下一個 .then
  return value + 3
})

.then((value) => {
  // 因此在這個 .then 的 resolvedCallback 中,可以取得上一個 .then 中 return 的值。
  console.log('In second then, the value is ' + value)
  console.log('In second Promise, start callback')
  
  // 如果我們在 .then 中是 return 另一個 new Promise
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // 1.5 秒後再執行
      resolve(value + 3)
      console.log('In second Promise, resovle data')
    }, 1500)
  })
})

// 則下一個 .then 會等到這個 Promise 中的 resolve 得到值後才執行。
.then((value) => {
  // 在這個 .then 的 resolvedCallback 中,可以得到上一個 new Promise 中 resolve 的值
  console.log('In third then, the value is ' + value)
})
.catch((reason) => {
  console.log('Request Failed ' + reason)
})


/**
 * EXAMPLE2: Return a new Promise in a Promise
 **/

function...