JavaScript 以其非同步特性而聞名,可以在不阻塞其他進程的情況下實現資料擷取、動畫和檔案處理等操作。 Promise 是優雅地處理非同步操作的核心,讓我們的程式碼更乾淨、更容易管理。這個專案 XPromise 是 JavaScript Promise 的自訂實現,幫助我們探索 Promise 機制的內部運作原理。
您可以在 GitHub 上查看完整的實作。
JavaScript 中的 Promise 是一個特殊的對象,表示非同步操作的最終完成或失敗。使用 Promises,我們可以將操作排隊以在任務完成後運行,即使我們不知道任務何時完成。以下是 Promise 的獨特之處:
建立自訂 Promise,如 XPromise,可以更深入地了解其內部工作原理:
讓我們瀏覽一下 XPromise 的程式碼,探索使其像 JavaScript 的原生 Promises 一樣運作的每個元件。
XPromise 先定義三種狀態:PENDING、FULFILLED 和 REJECTED。
const PENDING = "PENDING"; const FULFILLED = "FULFILLED"; const REJECTED = "REJECTED"; class XPromise { constructor(executor) { this.state = PENDING; this.queue = []; doResolve(this, executor); } // ... }
透過then、catch和finally,我們處理完成、拒絕和清理場景。 XPromise 實作連結的方式如下:
const PENDING = "PENDING"; const FULFILLED = "FULFILLED"; const REJECTED = "REJECTED"; class XPromise { constructor(executor) { this.state = PENDING; this.queue = []; doResolve(this, executor); } // ... }
handle 函數決定 Promise 是否仍有待處理或已解決。如果它處於待處理狀態,則處理程序將添加到佇列中以供稍後執行。如果 Promise 得到解決,它會立即處理處理程序。
then(onFulfilled, onRejected) { const promise = new XPromise(() => {}); handle(this, { promise, onFulfilled, onRejected }); return promise; } catch(onRejected) { return this.then(null, onRejected); } finally(onFinally) { return this.then(onFinally, onFinally); }
履行和拒絕的 Promise 需要特殊的函數來處理其結果。 XPromise 是如何實現這一目標的:
function handle(promise, handler) { while (promise.state !== REJECTED && promise.value instanceof XPromise) { promise = promise.value; } if (promise.state === PENDING) { promise.queue.push(handler); } else { handleResolved(promise, handler); } }
履行與拒絕:
完成排隊處理程序:
doResolve 函數透過包裝解析和拒絕呼叫來安全地運行執行器,防止多次呼叫它們時發生任何進一步的狀態變更。
function fulfill(promise, value) { if (value === promise) { return reject(promise, new TypeError()); } if (value && (typeof value === "object" || typeof value === "function")) { let then; try { then = value.then; } catch (e) { return reject(promise, e); } if (typeof then === "function") { return doResolve(promise, then.bind(value)); } } promise.state = FULFILLED; promise.value = value; finale(promise); } function reject(promise, reason) { promise.state = REJECTED; promise.value = reason; finale(promise); }
現在我們有了一個可以運行的 XPromise,讓我們用一個簡單的範例來嘗試:
function doResolve(promise, executor) { let called = false; function wrapFulfill(value) { if (called) return; called = true; fulfill(promise, value); } function wrapReject(reason) { if (called) return; called = true; reject(promise, reason); } try { executor(wrapFulfill, wrapReject); } catch (e) { wrapReject(e); } }
從頭開始重新實作 Promise 提供了有關如何在 JavaScript 中管理非同步程式設計的實作見解:
要深入了解程式碼,請查看 GitHub 上的 XPromise 專案。試驗程式碼並隨意自訂它以探索更高級的功能,例如 Promise 競爭條件、連結和嵌套!
以上是建構 XPromise:深入研究自訂 JavaScript Promise的詳細內容。更多資訊請關注PHP中文網其他相關文章!