jQuery callbacks.fired() 方法(完整指南)

什么是 jQuery callbacks.fired() 方法?

在前端开发中,异步操作无处不在。我们常常需要等待多个任务完成后再执行某个逻辑,比如加载图片、发送 API 请求、处理表单提交等。jQuery 为我们提供了非常强大的回调系统,而 callbacks.fired() 方法正是这个系统中的一个“状态探测器”。

想象一下你正在组织一场派对,邀请了五位朋友来帮忙布置。你不会在他们还没到齐时就开始切蛋糕。你需要知道“所有人是否都已经到达”——这个判断,就类似于 callbacks.fired() 的作用。

jQuery.callbacks.fired() 方法是 jQuery 事件回调系统中的一个辅助方法。它用于判断一个回调队列(callback queue)是否已经被触发过。换句话说,它帮助你确认“事件是否已经发生过”。

这个方法返回一个布尔值:true 表示该回调集合已经执行过一次或多次;false 表示尚未执行。

⚠️ 注意:这个方法只能用于通过 jQuery.Callbacks() 创建的回调对象,不能直接用于普通的函数或事件绑定。


如何创建一个回调对象?

要使用 callbacks.fired(),我们首先得创建一个回调对象。这就像为你的派对准备一个“签到本”——每来一个人,就在本子上记一笔。

// 创建一个回调对象,支持重复执行和顺序执行
var myCallbacks = $.Callbacks("once memory");

// 添加第一个回调函数
myCallbacks.add(function(name) {
    console.log("欢迎 " + name + " 来到派对!");
});

// 添加第二个回调函数
myCallbacks.add(function(name) {
    console.log(name + " 已经签到成功!");
});
  • $.Callbacks("once memory"):这里的参数是可选的配置项。
    • once:表示回调只能执行一次,执行完后不再响应后续调用。
    • memory:表示如果回调队列已经执行过,新添加的回调会立即执行(类似“补录”)。

✅ 小贴士:memory 选项非常重要,它让 fired() 方法更有意义——因为你可以在回调执行后,立刻知道它“已经发生过了”。


使用 callbacks.fired() 判断状态

现在我们有了一个回调对象,接下来就是验证它的执行状态。这就是 callbacks.fired() 的主场。

var myCallbacks = $.Callbacks("once memory");

// 添加两个回调函数
myCallbacks.add(function() {
    console.log("任务 A 完成");
});

myCallbacks.add(function() {
    console.log("任务 B 完成");
});

// 检查是否已触发
console.log("是否已触发?", myCallbacks.fired()); // 输出: false

// 手动触发所有回调
myCallbacks.fire();

// 再次检查状态
console.log("是否已触发?", myCallbacks.fired()); // 输出: true

运行结果:

是否已触发? false
任务 A 完成
任务 B 完成
是否已触发? true

这个例子清晰地展示了 fired() 的作用:它不改变状态,只是告诉你“事件是否已经发生”


实际应用场景:异步任务协调

让我们看一个更贴近实际开发的场景:两个异步请求,需要在两者都完成后执行一个函数。

// 创建一个回调队列,支持记忆功能
var asyncTasks = $.Callbacks("memory");

// 模拟第一个异步请求
function fetchUserData(userId, callback) {
    setTimeout(function() {
        console.log("用户数据加载完成: ID =", userId);
        callback();
    }, 1000);
}

// 模拟第二个异步请求
function fetchUserPosts(userId, callback) {
    setTimeout(function() {
        console.log("用户文章加载完成: ID =", userId);
        callback();
    }, 1500);
}

// 注册完成后的统一处理
asyncTasks.add(function() {
    console.log("🎉 所有数据加载完毕,开始渲染页面!");
});

// 开始请求
fetchUserData(123, asyncTasks.fire);
fetchUserPosts(123, asyncTasks.fire);

// 立即检查状态(此时还没完成)
console.log("任务是否已触发?", asyncTasks.fired()); // false

// 3秒后再次检查(此时应该已完成)
setTimeout(function() {
    console.log("任务是否已触发?", asyncTasks.fired()); // true
}, 3000);

在这个例子中:

  • asyncTasks.fire 被作为回调传入 fetchUserDatafetchUserPosts
  • 一旦任一请求完成,fire() 就会触发队列。
  • fired() 方法帮助我们判断“是否已经完成”,可以用于控制流程、显示加载状态、禁用按钮等。

和 .fire() 的配合使用:状态与行为分离

callbacks.fired().fire() 是一对黄金搭档。一个负责“看”,一个负责“做”。

var notifier = $.Callbacks("once memory");

// 定义一个通知函数
notifier.add(function(message) {
    alert("系统通知:" + message);
});

// 模拟用户登录成功
function onLoginSuccess() {
    // 检查是否已通知过
    if (notifier.fired()) {
        console.log("通知已发送,跳过重复发送");
        return;
    }

    // 否则发送通知
    notifier.fire("登录成功,欢迎回来!");
    console.log("通知已发送");
}

// 测试:多次调用
onLoginSuccess(); // 输出: 通知已发送
onLoginSuccess(); // 输出: 通知已发送,跳过重复发送
onLoginSuccess(); // 输出: 通知已发送,跳过重复发送

这个例子展示了 fired() 的防重复机制。它让你在执行动作前先“查岗”,避免重复操作,非常适用于登录提示、错误弹窗、日志记录等场景。


配置选项详解:影响 fired() 的行为

$.Callbacks() 的配置参数会直接影响 fired() 的判断逻辑。下面列出几个关键选项:

选项 作用说明 对 fired() 的影响
once 回调只能执行一次 fired() 在第一次 fire() 后变为 true,永远不变
memory 保存最后一次执行状态,新添加的回调会立即执行 fired()true 时,新添加的函数会立刻执行
unique 防止重复添加相同的回调函数 不影响 fired(),但避免重复执行
stopOnFalse 一旦某个回调返回 false,停止后续执行 fired() 仍为 true,只要至少一个执行过

💡 重点:只有当至少有一个回调被触发过,fired() 才会返回 true。即使队列中有多个函数,只要没执行,状态就是 false


常见误区与注意事项

  1. 不要误用在普通函数上
    fired()jQuery.Callbacks() 对象的方法,不能用于普通函数或事件监听器。

    // ❌ 错误用法
    function myFunc() { console.log("hello"); }
    myFunc.fired(); // 报错:方法不存在
    
    // ✅ 正确用法
    var cb = $.Callbacks();
    cb.add(myFunc);
    cb.fired(); // 正常工作
    
  2. memory 选项是关键
    如果没有 memory,即使你 fire() 了,之后再添加的回调也不会执行,fired() 依然会返回 true。但你无法感知“它是否已被触发过”。

  3. oncememory 结合使用最安全
    通常推荐:$.Callbacks("once memory") —— 保证执行一次、能记忆、状态可查。


总结:掌握 callbacks.fired() 的价值

jQuery.callbacks.fired() 方法虽然看似简单,但它在复杂异步流程中扮演着“状态守门人”的角色。它让我们能够:

  • 精确判断某个任务是否已完成
  • 避免重复执行逻辑
  • 实现优雅的流程控制
  • 提升代码的可维护性和健壮性

尤其在处理多个异步请求、用户交互、定时任务等场景下,这个方法非常实用。它不是万能钥匙,但却是 jQuery 回调系统中不可或缺的一环。

最后提醒:虽然 jQuery 已不再是前端主流框架,但其设计思想(尤其是回调机制)依然影响深远。理解 callbacks.fired(),就是理解“事件驱动”编程的底层逻辑。

掌握这个方法,你就能在面对复杂任务时,心中有数、不慌不乱。就像派对主人,知道谁来了、谁没来,自然能掌控全局。