执行完成jquery $ .when()的回调一次(在backbone-js app中)

时间:2012-12-26 00:54:18

标签: javascript jquery asynchronous backbone.js jquery-deferred

我正在寻找一种方法在$.when()回调执行一次后“取消绑定”jQuery的.done(),类似于使用jQuery的.one()而不是{{1}对于单个事件。我在这种情况下使用延迟对象而不是事件的原因是因为我需要等待多个异步进程完成才能执行回调。

为了更详细,我正在开发一个骨干应用程序,我在每个页面都有一个模型和视图。显示新页面的顺序如下所示:

  1. 传入页面的视图(称为页面A)被告知要呈现
  2. 页面A使用
  3. .on()等待异步进程(3,4和5)解析
  4. 页面A的数据从服务器加载,填充模型
  5. 页面A的模型中的图像已预加载
  6. 上一页,第B页,完成关闭(动画完成)
  7. 呈现的页面
  8. 这在假设的场景中工作正常,其中每个页面仅由用户访问一次。但是,页面显然需要重复访问,这意味着当用户在网站上的其他位置导航后再次打开和关闭页面B时,与其$.when()方法完成相关的延迟对象将再次被解析,在页面A的.close()方法中执行.done()回调的代码块,这是不好的。

    理想情况下,.render()代码块只要执行一次就会“解除绑定”,或者在每个页面的$.when().done()方法中,就像许多其他事件侦听器未绑定一样。

    我不确定这是否可能,所以也许有替代方法来实现我在这里尝试做的事情?也许他们是一条沟渠延迟并听取多个事件来解雇?

    感谢。

1 个答案:

答案 0 :(得分:0)

在内部,jQuery在其许多方法中使用“回调”队列来管理多个函数的添加/删除/触发(例如,事件处理程序)。

这些队列的构造函数公开为$.Callbacks(flags)。可以利用标志“一次”,“内存”,“唯一”和“stopOnFalse”来控制触发时队列的详细行为。阅读更多here

我不确定“访问”和“重复访问”的性质是什么,但假设存在javascript状态的持久性,否则你就不会有问题。我想你需要这样的东西:

//First let's assume you have three promises, corresponding to your steps 3,4,5
var promiseA = .....;
var promiseB = .....;
var promiseC = .....;

//Then you need one or more worker functions
function myFunction() {
    //do whatever is necessary when promises A,B,C are all resolved.
}

//Create a Callbacks queue with the 'once' flag
var callbacks = $.Callbacks('once');//'once' ensures the callback list can only be fired once.
callbacks.add(myFunction);
//add further callback functions here if necessary.

//Now the glue that puts it all together.
$.when(promiseA, promiseB, promiseC).done(callbacks.fire);

//Or, if you need to pass any paramters to the callback function:
$.when(promiseA, promiseB, promiseC).done(function() {
    callbacks.fire(...);
});