es6非同步

promise, async/await

by Shang-De You

JavaScript

// ========== 定義 Promise任務 (API) ==========

let promiseTasks = {
	getName() {
  	return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log("getName done")
        data = "James"
        resolve(data)
      }, parseInt(Math.random() * 500));
    })
  }, 
  getLocation() {
  	return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log("getLocation done")
        data = "Taipei"
        resolve(data);
      }, parseInt(Math.random() * 500));
    })
  }, 
  getYear(){
  	return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log("getYear done")
        data = 2018
        resolve(data)
      }, parseInt(Math.random() * 500));
    })
  }
}



/*
Promise.all([getName, getLocation, getYear])
	.then((data)=> {
    // 一次性同時回傳成功訊息,回傳以上三個數值的陣列
    console.log(data);
  }).catch( err => {
    // 失敗訊息 (立即)
    console.log(err)
  })
*/
  
// ========== async function ==========  



let doSearch = () => {
	//查詢姓名
	let getName = promiseTasks.getName()
  //查詢地點
  let getLocation = promiseTasks.getLocation()
  //查詢年
  let getYear = promiseTasks.getYear()
  
  let async_viewData1 = async () => {
    let promise = await Promise.all([getName, getLocation, getYear])
    let data = {
      name: promise[0],
      location: promise[1],
      year: promise[2] + '年'
    }
    return data
  }

  let async_viewData2 = async () => {
    let promise = await Promise.all([getName, getLocation])
    let data = {
      fullName: promise[0],
      city: promise[1],
    }
    return data
  }

	async_viewData1()
    .then(result => {
      console.log(result)
    })
    .catch(err => {
      console.log("fail")
    })

  async_viewData2()
    .then(result => {
      console.log(result)
    })
    .catch(err => {
      console.log("fail")
    })
    
}

doSearch()