iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

異步編程

異步編程是JavaScript中處理長時間操作(如I/O操作、HTTP請求、定時器等)的核心概念之一。由於JavaScript 是單線程語言,它無法同時處理多個任務,因此異步機制能夠讓JavaScript在處理耗時任務的同時,繼續執行其他任務,避免程式卡頓或凍結。

異步編程的核心概念

  1. 非阻塞執行:
    異步編程的主要特點是非阻塞執行。這意味著程序可以啟動一個操作,然後立即繼續執行下一行代碼,而不需要等待該操作完成。
console.log("開始");
setTimeout(() => {
  console.log("這是一個異步操作");
}, 1000);
console.log("結束");
  1. 並發性:
    異步編程允許多個操作同時進行,提高了程序的效率和響應性。這在處理多個獨立任務時特別有用。

  2. 回調和事件驅動:
    異步操作通常通過回調函數或事件監聽器來處理結果。當異步操作完成時,會調用預定義的函數或觸發特定事件。

  3. 提高使用者體驗:
    在前端開發中,異步編程可以防止長時間運行的任務阻塞用戶界面,從而提供更流暢的用戶體驗。

  4. 資源利用
    異步編程允許更有效地利用系統資源。例如,在等待I/O操作完成時,CPU可以執行其他任務。

  5. 錯誤處理
    異步操作的錯誤處理通常更加複雜,因為錯誤可能發生在主程序流之外。

適用場景:

  • 網絡請求
  • 文件I/O操作
  • 定時器和間隔
  • 數據庫查詢
  • 複雜計算

實現方式

在JavaScript中,異步編程主要通過以下方式實現:

  • 回調函數
  • Promises
  • Async/Await
  • 事件監聽器

回調函數 (Callback)

回調函數是最基本的異步處理方式。當一個操作完成時,會調用你傳遞的回調函數來執行後續邏輯。

機制:

  • JavaScript會將函數作為參數傳遞給另一個函數,通常會將長時間運行的任務交給瀏覽器或Node.js的環境處理(如定時器、HTTP請求等),然後繼續執行其他同步任務。
  • 當該長時間任務完成後,會將回調函數推送到事件隊列中等待執行。
  • 在主函數執行過程中,回調函數不會立即執行。
  • 當主函數中的某些操作完成後,回調函數被調用。
function fetchData(callback) {
  console.log("開始獲取數據...");
  setTimeout(() => {
    const data = { id: 1, name: "John Doe" };
    callback(data);
  }, 2000);  // 模擬網絡請求延遲
}

function processData(data) {
  console.log("數據處理完成:", data);
}

fetchData(processData);
console.log("請求已發送");

//開始獲取數據...
//請求已發送
//(2秒後)
//數據處理完成: { id: 1, name: "John Doe" }

優點:
1.簡單直接:容易理解和實現。
2.靈活:可以根據需要傳遞不同的回調函數。
3.廣泛支持:幾乎所有JavaScript環境都支持。

缺點:
1.調地獄:嵌套多個回調可能導致代碼難以閱讀和維護。
2.錯誤處理複雜:每個回調都需要單獨的錯誤處理。
3.控制流難以管理:複雜的異步操作序列可能變得混亂。

因此為了避免回調地獄,通常會採用"錯誤優先"的回調風格:

function fetchData(callback) {
  // ...
  if (error) {
    callback(error, null);
  } else {
    callback(null, data);
  }
}

fetchData((error, data) => {
  if (error) {
    console.error("出錯了:", error);
    return;
  }
  console.log("數據:", data);
});

上一篇
d13 作用域與閉包
下一篇
d15 異步編程(中)
系列文
javascript基礎自學及各工具應用了解30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言