如何使用JavaScript中的promises创建全局加载指示符

时间:2014-02-26 12:45:05

标签: javascript jquery backbone.js promise

我正在构建一个大型骨干木偶应用程序,其中AJAX请求在各种不同的地方(路由器和视图)启动。我的应用上有一个加载指示符(nprogress),我希望在请求正在进行时on,并在所有请求完成时offvar 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}}数组?

1 个答案:

答案 0 :(得分:0)

这是一个使用Marionette的答案,但相同的概念适用于普通的Backbone(你只需要自己渲染,显示,关闭视图):

BackboneJS - How to add a Progressbar while fetching collection

关于ajaxStart和ajaxStop事件,请注意它们也会被非骨干请求触发,这可能不是你想要的......