管理大量 backbone 个异步请求

Managing lots of backbone async requests

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

但是,我只想在所有数据加载完成后向用户展示案例。

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

是否有可能注册各种提取并在它们全部完成时获取事件的任何标准或常用方法?

我正在考虑构建一个复杂的布尔系统来执行此操作,但我想知道是否可能没有一些插件已经执行此操作。

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

之类的东西相关联

当所有这些抓取完成后,我得到一个类似 load:case:data 的事件完成。那时我可以收听那个事件并显示案例。

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

您也可以使用普通的 jQuery 来做到这一点。例如:

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

您还可以替代 Q、BlueBird 和 jQuery 的一种方法是原生 Promise.all ES6 方法,请查看以下 table 以获得支持,看看是否可行匹配您的目标浏览器。

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

好吧,Promises 肯定会为此工作,但您需要承诺您的异步功能。你曾经在哪里工作过:

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 也适用于此。