管理大量骨干异步请求

时间:2015-08-20 13:08:54

标签: javascript jquery ajax backbone.js asynchronous

我正在构建单页面Web应用程序。例如,当用户在应用程序中打开一个案例时,我需要异步加载各种数据。

但是,我只想在所有数据加载完毕后向用户提供案例。

我目前使用Backbone以异步方式获取数据集合。

是否有任何标准或通常的方式可能注册各种提取并在完成事件后获得事件?

我正在考虑建立一个精心设计的bool系统来做这个,但我想知道是否有一些插件已经做到了这一点。

基本思路是: 注册一堆主干提取并将它们与load:case:data

之类的内容相关联

当所有这些提取完成后,我会完成load:case:data之类的事件。那时我可以听那个事件并展示案例。

2 个答案:

答案 0 :(得分:4)

我建议查看Q promise Library(Q.all)或BlueBird(Promise.all),然后您可以同步fetch方法返回的promise。

你也可以使用普通的jQuery。 e.g:

$.when(someCollection.fetch(), anotherCollection.fetch()).done(function(){
   // All Completed, do next thing
});

您还可以使用一件事作为Q的替代方案,BlueBird和jQuery是本机Promise.all ES6方法,请查看下表以获取支持,并查看它是否与您的目标浏览器匹配。

https://kangax.github.io/compat-table/es6/

答案 1 :(得分:1)

好吧,Promise对此肯定有效,但您需要宣传您的异步功能。你曾经这样工作的地方:

asynFunction(function(data) {
    //callback
    //data is finished.
});

现在你需要像这样工作:

var prom = new Promise(function(resolve) {
    asynFunction(resolve);
});
prom.then(function(data){
     //data is here
});

使用Promise.all您可以发送所有承诺:

var prom1 = new Promise(function(resolve) {
    asynFunction1(resolve);
});

var prom2 = new Promise(function(resolve) {
    asynFunction2(resolve);
});

var prom3 = new Promise(function(resolve) {
    asynFunction3(resolve);
});

var pall = Promise.all([prom1, prom2, prom3]);
pall.then(function(values){
    //values is an array with the result of every promise.
    //this function won't be called until all promises have been resolved.
});

Promise有几种替代方法,如果我没记错的话,Async.js也适用于此。