当前位置:首页 > JavaScript

deferred实现原理 js

2026-02-03 04:59:23JavaScript

实现原理

Deferred 在 JavaScript 中是一种用于管理异步操作的模式,通常与 Promise 类似,但提供更灵活的控制。核心思想是通过对象封装异步操作的状态(pending、resolved、rejected),并允许通过回调函数处理结果或错误。

核心机制

  1. 状态管理
    Deferred 对象内部维护三种状态:

    • pending:初始状态,表示操作未完成。
    • resolved:操作成功完成,触发成功回调。
    • rejected:操作失败,触发失败回调。
  2. 回调注册
    通过 thendonefail 等方法注册回调函数,这些函数会在状态改变时被调用。例如:

    deferred.then(successCallback, errorCallback);
  3. 状态触发
    通过 resolvereject 方法手动改变状态,并传递结果或错误信息:

    deferred实现原理 js

    deferred.resolve(data); // 触发成功回调
    deferred.reject(error); // 触发失败回调

简单实现示例

以下是一个基础的 Deferred 实现:

function Deferred() {
  let status = 'pending';
  let callbacks = { success: [], fail: [] };
  let result;

  this.then = function(onSuccess, onFail) {
    if (status === 'resolved') onSuccess(result);
    else if (status === 'rejected') onFail(result);
    else {
      if (onSuccess) callbacks.success.push(onSuccess);
      if (onFail) callbacks.fail.push(onFail);
    }
    return this;
  };

  this.resolve = function(data) {
    if (status !== 'pending') return;
    status = 'resolved';
    result = data;
    callbacks.success.forEach(fn => fn(data));
  };

  this.reject = function(error) {
    if (status !== 'pending') return;
    status = 'rejected';
    result = error;
    callbacks.fail.forEach(fn => fn(error));
  };
}

使用场景

  1. 封装异步操作
    例如 AJAX 请求:

    deferred实现原理 js

    const deferred = new Deferred();
    fetch(url).then(
      response => deferred.resolve(response),
      error => deferred.reject(error)
    );
    return deferred;
  2. 链式调用
    Deferred 的 then 方法支持链式调用,类似 Promise:

    deferred
      .then(handleSuccess)
      .then(handleNextStep);

与 Promise 的区别

  1. 控制权
    Deferred 允许外部手动调用 resolve/reject,而 Promise 的状态由执行器函数内部控制。

  2. 兼容性
    Deferred 是早期库(如 jQuery)的实现,现代 JavaScript 更推荐原生 Promise 或 async/await

标签: 原理deferred
分享给朋友:

相关文章

vue实现放大镜原理

vue实现放大镜原理

Vue 实现放大镜原理 实现放大镜效果的核心原理是通过鼠标移动事件获取位置信息,动态计算放大区域并显示放大后的图像。以下是基于 Vue 的实现方法: 基本结构设计 HTML 部分需包含原图容器、放…

vue模版实现原理

vue模版实现原理

Vue 模板实现原理 Vue 的模板实现主要基于编译和虚拟 DOM 技术,将模板转换为可执行的渲染函数。以下是其核心实现原理: 模板编译过程 Vue 模板通过编译器将 HTML 模板字符串转换为渲染…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

css动画制作原理

css动画制作原理

CSS动画制作原理 CSS动画通过改变元素的样式属性实现动态效果,主要依赖关键帧(@keyframes)和动画属性(如animation-name、animation-duration)的配合。核心原…

vue bus实现原理

vue bus实现原理

Vue 事件总线(Bus)实现原理 Vue 事件总线(Bus)是一种跨组件通信的机制,通常用于非父子组件之间的数据传递。其核心原理基于 Vue 实例的事件系统。 核心机制 Vue 事件总线通过创建…

vue router实现原理

vue router实现原理

Vue Router 的实现原理 Vue Router 是 Vue.js 的官方路由管理器,其核心原理基于前端路由的两种模式:Hash 模式和 History 模式。以下是其实现的关键点: Has…