JavaScript是一種單線程語言,這意味著它一次只能執行一個任務。然而,在Web開發中,我們經常需要處理異步操作,例如網絡請求、定時器、事件監聽等。JavaScript提供了多種方式來處理異步編程,包括回調函數、Promise、Async/Await等。
回調函數
回調函數是最基本的異步編程方式。當一個異步任務完成時,它會調用一個回調函數。這種方式的問題是回調地獄,即回調函數嵌套過多,難以理解和維護。
function asyncTask(callback) {setTimeout(() => {callback('Async task completed');}, 1000);
}asyncTask((result) => {console.log(result);
});
?
Promise
Promise是ES6引入的一種異步編程解決方案。它是一個對象,代表了一個異步操作的最終完成(或失敗)及其結果值。
let promise = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise resolved');}, 1000);
});promise.then((result) => {console.log(result);
}).catch((error) => {console.log(error);
});
Promise有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。Promise對象的狀態一旦改變,就不會再變,任何時候都可以得到這個結果。
?
Async/Await
Async/Await是ES7引入的一種新的異步編程解決方案,它是基于Promise的。Async/Await使得異步代碼看起來像同步代碼,更易于理解和維護。
async function asyncTask() {return new Promise((resolve, reject) => {setTimeout(() => {resolve('Async task completed');}, 1000);});
}async function run() {let result = await asyncTask();console.log(result);
}run();
Async函數返回一個Promise對象,可以使用then方法添加回調函數。Await表達式會暫停async函數的執行,等待Promise的解決,然后恢復async函數的執行并返回解決值。
?
錯誤處理
在異步編程中,錯誤處理是一個重要的問題。Promise提供了catch方法來捕獲錯誤,Async/Await可以使用try/catch來捕獲錯誤。
async function asyncTask() {throw new Error('Async task error');
}async function run() {try {let result = await asyncTask();console.log(result);} catch (error) {console.log(error);}
}run();
并發和并行
Promise.all和Promise.race可以用來處理并發和并行任務。
let promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 1 resolved');}, 1000);
});let promise2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 2 resolved');}, 2000);
});Promise.all([promise1, promise2]).then((results) => {console.log(results);
});Promise.race([promise1, promise2]).then((result) => {console.log(result);
});