Javascript 执行jquery$.when()的已完成回调一次(在主干js应用程序中)

Javascript 执行jquery$.when()的已完成回调一次(在主干js应用程序中),javascript,jquery,asynchronous,backbone.js,jquery-deferred,Javascript,Jquery,Asynchronous,Backbone.js,Jquery Deferred,我正在寻找一种方法,在执行.done()回调一次后,在执行.done()回调一次后,将jQuery的.one()解除绑定,类似于对单个事件使用jQuery的.on()而不是.on()。在这种情况下,我之所以使用延迟对象而不是事件,是因为我需要等待多个异步进程完成,然后才能执行回调 更详细地说,我正在开发一个主干应用程序,其中每个页面都有一个模型和视图。显示新页面的顺序如下所示: 传入页面(称为页面A)的视图被告知要呈现 $。页面A使用when()等待异步进程(3、4和5)解析 页面A的数据从服务

我正在寻找一种方法,在执行
.done()
回调一次后,在执行
.done()
回调一次后,将jQuery的
.one()
解除绑定,类似于对单个事件使用jQuery的
.on()
而不是
.on()。在这种情况下,我之所以使用延迟对象而不是事件,是因为我需要等待多个异步进程完成,然后才能执行回调

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

  • 传入页面(称为页面A)的视图被告知要呈现
  • $。页面A使用when()
    等待异步进程(3、4和5)解析
  • 页面A的数据从服务器加载,填充模型
  • 页面A模型中的图像已预加载
  • 上一页B页结束关闭(动画完成)
  • 页面A已呈现
  • 在一个假设的场景中,每个页面只被用户访问一次,这样做很好。但是,页面显然会受到重复访问的影响,这意味着当用户在网站上其他地方导航后再次打开和关闭页面B时,与完成
    .close()
    方法相关的延迟对象将再次解析,执行
    .done()的代码块
    页面A的
    .render()
    方法中的回调,这不好

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

    我不确定这是否可能,所以也许有其他方法来实现我在这里尝试的目标?也许他们是一条抛弃延迟、倾听多个事件的道路

    谢谢。

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

    这些队列的构造函数公开为
    $。回调(标志)
    。可以利用标志“once”、“memory”、“unique”和“stopOnFalse”来控制触发时队列的详细行为。阅读更多

    我不确定“访问”和“重复访问”的本质是什么,但假设存在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(...);
    });
    

    不是100%清楚什么是问题…是否能够创建一个defffered数组并使用
    $。如果数组上有长度帮助,当在数组上使用
    时?下面是我所说的示例,它是一系列AJAX调用,未知数量,但最终内容取决于所有已完成的调用。我知道您可以实现
    $。when.apply($,arrayOfDeferreds)
    以等待承诺列表完成,但我希望能够解除绑定
    $。完成后,或者,下次访问页面时更改arrayOfDeferreds参数的内容,使其等待新的延迟列表进行解析(并且不再关心旧列表)。这不起作用,因为
    $。when.apply
    不是将数组作为引用,而是简单地将其内容作为单个参数应用。我只是想下次加载页面时数组可能会更改。。。或者如果它是空的,请不要调用$。当