一次搞懂如何使用 Promise 實現非同步操作
前言
在現代 Web 開發中,處理非同步操作是一個很常見的需求。JavaScript 提供了一些內建的方法來處理非同步操作,例如 setTimeout、XMLHttpRequest、Fetch API 等等。Promise
就是一種能夠更好地處理非同步操作的方法。
同步與非同步
在開始學習 Promise 之前,我們需要先了解什麼是同步操作和非同步操作。
JavaScript 是一種單線程 (single-thread)
的程式語言,也就是說它在任意一個時間點只能執行一個任務。當程式碼在運行時,如果遇到一個耗時較長的操作 (複雜的計算 or 巨大的迴圈),如果這個操作是同步的,則整個程式碼會被阻塞 (blocked) ,直到這個操作完成。這種方式稱為同步操作。
相反的,當程式碼遇到一個非同步操作時,它不會等待這個操作完成,而是會繼續執行下去,直到該操作完成後才會通知程式碼。在這種情況下,程式碼不會被阻塞,因為它可以繼續執行其他的操作。當操作完成時,通常會執行一個回調函式 (callback function) 來處理操作的結果。這種方式稱為非同步操作。而以下是一個簡單的非同步操作範例:
console.log("start");
setTimeout(() => {
console.log("middle");
}, 1000);
console.log("end");
// output:
// start
// end
// middle
以上程式碼會先輸出 start、end,然後一秒後再輸出 middle。這是因為 setTimeout 方法是一個非同步操作,當 JavaScript 遇到 setTimeout 時,會將其加入**事件循環(Event Loop)中,並繼續執行後續程式碼,等到指定的時間過後,setTimeout 才會被加入到待處理的事件佇列中,等到 JavaScript 處理完當前的程式碼後,才會從事件佇列(callback queue)**中取出 setTimeout 並執行其中的函式。