JS 同時獲取多個非同步請求資料 Promise.all()
阿新 • • 發佈:2021-11-19
普通介面呼叫寫法.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