把以前的誤解給釐清。
簡述
首先 async 和 await 是一個 ES7 推出的語法糖,讓你可以用很像同步的方式來寫處理非同步。範例可以參考我以前寫的文章:Promise 的小技巧
總之再強調一次,async 和 await 只是「看起來很像同步」,但背後一樣是非同步。
根據我在網路上找的資料是說,其實背後也是用 Promise 包裝起來,也因為這個原因 await 一定要放在 async function 裡才能運作。
所以我寫了一段對應的程式碼,可以比較一下差異。
- async 的寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const getData = (url) => { return new Promise(resolve => { const request = new XMLHttpRequest(); request.open('GET', api200, true); request.onload = () => { resolve(JSON.parse(request.responseText)) }; request.send(); }) }
const sendAllRequestByAsync = async () => { const data1 = await getData(api200) console.log('1', data1); const data2 = await getData(api200) console.log('2', data2); const data3 = await getData(api200) console.log('3', data3); }
|
- Promise 的寫法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| const getData = (url) => { return new Promise(resolve => { const request = new XMLHttpRequest(); request.open('GET', api200, true); request.onload = () => { resolve(JSON.parse(request.responseText)) }; request.send(); }) }
const sendAllRequestByPromise = () => { getData(api200) .then(data => { const data1 = data console.log('1', data1) return getData(api200) }) .then(data => { const data2 = data console.log('2', data2) return getData(api200) }) .then(data => { const data3 = data console.log('3', data3) return getData(api200) }) }
|