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中文网其他相关文章!