1. 程式人生 > 其它 >JS 同時獲取多個非同步請求資料 Promise.all()

JS 同時獲取多個非同步請求資料 Promise.all()

普通介面呼叫寫法.then() 或者使用es6的 async/await 非同步轉同步

//   function Index() {
//       普通呼叫巢狀寫法
//       console.time()
//       const p1 = new Promise((resolve, reject) => {
//         console.log('這裡是p1')
//         setTimeout(() => {
//           resolve('這裡是p1的返回')
//         }, 1000)
//       }).then((r1) => {
//         new Promise((resolve, reject) => {
// console.log('這裡是p2') // setTimeout(() => { // resolve('這裡是p2的返回') // }, 1000) // }).then((r2) => { // console.log(r1) // console.log(r2) // console.timeEnd() // }) // }) // } //非同步轉同步 async function Index2() { console.time() const p1
=await new Promise((resolve, reject) => { console.log('這裡是p1') setTimeout(() => { resolve('這裡是p1的返回') }, 1000) }) const p2 =await new Promise((resolve, reject) => { console.log('這裡是p2') setTimeout(() => { resolve('這裡是p2的返回') },
1000) }) console.log(p1) console.log(p2) console.timeEnd() } //Index(); Index2();

用時2

使用Promise.all()來實現呼叫

  async function Index() {
      console.time()
      const p1 = new Promise((resolve, reject) => {
        console.log('這裡是p1')
        setTimeout(() => {
          resolve('這裡是p1的返回')
        }, 1000)
      })
      const p2 = new Promise((resolve, reject) => {
        console.log('這裡是p2')
        setTimeout(() => {
          resolve('這裡是p2的返回')
        }, 1000)
      })
      Promise.all([p1, p2]).then((val) => {
        console.log(val)
        console.timeEnd()
      })
       //當然也可以使用 async/await寫法
       /*   
        const p = await Promise.all([p1, p2])
        console.log(p);
        console.timeEnd(); 
        */
       //補充說明:如果我們的介面已經套上了一層 promise 便已經實現了同時執行非同步的條件
       //下面這種寫法耗時和Promise.all也是一樣的,但是巢狀多了可能程式碼就不太優雅了
       /*  p1.then((r1) => {
        p2.then((r2) => {
          console.log(r1)
          console.log(r2)
          console.timeEnd()
        })
      }) */
        
    }
    Index()

用時1s