Asynchronous JavaScript and XML
可以使網頁與伺服器進行非同步更新,不需要重新載入網頁的技術。
較舊的PHP網站,可能有區域資料變動,就需要重新向伺服器請求,並在伺服器端重新渲染HTML,再由瀏覽器接收新的HTML造成頁面刷新,但是更改的區域又很小,造成不必要的資源浪費。
AJAX則資料皆在客戶端處理,不需要刷新頁面,即可更新DOM。
JS 是一個非同步語言
執行帶有 setTimeout / API Call 不會停下來等待完成後,才進行下一個,因此可能出現錯誤。
Ex: 取得伺服器資料時太慢,後續程序得不到資料而報錯。
同步: 看似所有動作同時進行,實則相反!!!
一個動作執行完,才作下一個動作
非同步: 可以同時進行多個任務
不需要等待上一個動作完成,才作下一個動作
CallBackHell:
如果太多需要順序性的程式,就會造成多層巢狀,而難以維護。
let funcA = function (callback) {
window.setTimeout(() => {
console.log('function A')
// 如果 callback 是個函式就呼叫它
if (typeof callback === 'function') { callback() }
}, 3000)
}
let funcB = function () {
window.setTimeout(() => { console.log('function B') }, 1000)
}
// 模擬 funcA 資料回傳較慢,導致 funcB 會先執行
funcA()
funcB()
// 為了確保 funcA 內容先作完,才作 funcB 內容
funcA(funcB)
支援度差的瀏覽器可用 es6-promise polyfill
要提供函式有promise功能,使函式return promise物件即可
串接函式順序 使用 then,resolve才會繼續作下去
若不管順序,只求全部完成使用 Promise.all()
Promise 回傳結果只有 完成(resolve) 或 拒絕(reject)
// 宣告一個Promise
const p1 = new Promise((resolve, reject) => {
resolve('OK')
// reject(new Error('Error'))
})
// 提供 Function 有 promise功能
function promiseFunc(url) {
return new Promise((resolve, reject) => {
resolve('OK')
// reject(new Error('Error'))
})
}
// 串接函式順序 使用 then
funcA().then(funcB).then(funcC)
// Promise.all()
Promise.all([funcA(), funcB()])
.then((result) => {
console.log(result)
}).catch((err) => { console.error(err) })