# JavaScript的異步操作方法是什么
## 目錄
1. [引言](#引言)
2. [同步與異步編程基礎](#同步與異步編程基礎)
3. [回調函數(Callbacks)](#回調函數callbacks)
4. [Promise對象](#promise對象)
5. [Async/Await語法](#asyncawait語法)
6. [事件監聽(Event Listeners)](#事件監聽event-listeners)
7. [Generator函數](#generator函數)
8. [Web Workers](#web-workers)
9. [異步編程最佳實踐](#異步編程最佳實踐)
10. [常見問題與解決方案](#常見問題與解決方案)
11. [總結](#總結)
---
## 引言
JavaScript作為單線程語言,通過異步操作實現非阻塞式編程。本文將系統介紹7種主流異步方案及其應用場景。
---
## 同步與異步編程基礎
### 同步編程特點
```javascript
console.log("步驟1");
console.log("步驟2"); // 必須等待步驟1完成
console.log("啟動請求");
setTimeout(() => console.log("請求完成"), 1000);
console.log("繼續執行"); // 不等待定時器
關鍵差異: - 同步:阻塞式執行 - 異步:非阻塞式執行 - 執行順序:同步代碼 > 微任務 > 宏任務
function fetchData(callback) {
setTimeout(() => {
callback('數據加載完成');
}, 1000);
}
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
getUser(id, user => {
getOrders(user, orders => {
getItems(orders, items => {
// 嵌套層級持續加深
});
});
});
解決方案: - 拆分為命名函數 - 使用Promise/Async
const promise = new Promise((resolve, reject) => {
if (success) {
resolve(value);
} else {
reject(error);
}
});
fetch('/api/data')
.then(response => response.json())
.then(data => processData(data))
.catch(error => handleError(error));
Promise.all([p1, p2]).then(values => {});
Promise.race([p1, p2]).then(first => {});
async function loadData() {
try {
const response = await fetch('/api');
const data = await response.json();
return data;
} catch (error) {
console.error(error);
}
}
async function parallel() {
const [res1, res2] = await Promise.all([
fetch(url1),
fetch(url2)
]);
}
button.addEventListener('click', () => {
console.log('按鈕被點擊');
});
const emitter = new EventEmitter();
emitter.on('data', data => handleData(data));
emitter.emit('data', payload);
function* gen() {
yield '第一步';
yield '第二步';
return '完成';
}
const g = gen();
g.next(); // { value: '第一步', done: false }
function* fetchUser() {
const user = yield fetch('/user');
const posts = yield fetch('/posts');
}
const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = e => console.log(e.data);
// worker.js
self.onmessage = function(e) {
const result = heavyCalculation(e.data);
self.postMessage(result);
};
解決方案:
process.on('unhandledRejection', error => {});
防護方案:
function once(callback) {
let called = false;
return (...args) => {
if (!called) {
called = true;
callback(...args);
}
};
}
| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 回調函數 | 簡單異步操作 | 兼容性最好 | 容易產生嵌套 |
| Promise | 鏈式異步操作 | 可讀性高 | 無法取消 |
| Async/Await | 復雜異步流程 | 同步式編寫 | 需要ES2017+支持 |
| Web Workers | CPU密集型任務 | 不阻塞主線程 | 通信成本高 |
未來趨勢:Top-Level Await、Observable等新特性正在普及。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。