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
不是将数组作为引用,而是简单地将其内容作为单个参数应用。我只是想下次加载页面时数组可能会更改。。。或者如果它是空的,请不要调用$。当