我正在构建一个大型骨干木偶应用程序,其中AJAX请求在各种不同的地方(路由器和视图)启动。我的应用上有一个加载指示符(nprogress),我希望在请求正在进行时on
,并在所有请求完成时off
。var vent = new Wreqr.EventAggregator()
,promises = [];
vent.on("fetch", function(promise) {
var wasEmpty = promises.length === 0;
promise instanceof Array ? promises.concat(promise) : promises.push(promise);
console.log("Added promise");
if(wasEmpty) {
util.loading(true);
console.log("Loading on");
$.when.apply($, promises).done(function() {
util.loading(false);
console.log("Loading off");
});
}
});
我正在尝试为这些请求设置一个全局处理程序,以确保在请求仍在进行时我不会关闭加载指示器。
这是我到目前为止所拥有的:
vent
我正在使用Marionette的EventAggregator,但我不认为你需要熟悉它才能得到我想要做的事情。我正在创建一个“全局”.trigger()
对象,我可以fetch
.apply
一个promises
事件,并将我的承诺作为参数传递。我希望这个对象在关闭时打开加载指示器,并且只在所有请求完成后关闭它。
我不相信这会像现在一样写,因为promises
在执行时应用$.when()
的内容,而不是通过引用,所以当我向{添加另一个承诺时过了一会儿{1}}数组,它不会等待它。很难对此进行测试,因为AJAX请求速度非常快,但我几乎肯定这是正在发生的事情。
以前有人曾经处理过此问题,或者建议我如何将promises
应用于全球更新的{{1}}数组?
答案 0 :(得分:0)
这是一个使用Marionette的答案,但相同的概念适用于普通的Backbone(你只需要自己渲染,显示,关闭视图):
BackboneJS - How to add a Progressbar while fetching collection
关于ajaxStart和ajaxStop事件,请注意它们也会被非骨干请求触发,这可能不是你想要的......