【问题标题】:Managing lots of backbone async requests管理大量主干异步请求
【发布时间】:2015-08-20 13:08:53
【问题描述】:

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

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

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

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

我正在考虑构建一个复杂的布尔系统来做到这一点,但我想知道是否可能没有一些插件已经这样做了。

基本思路是: 注册一堆主干获取并将它们与load:case:data 之类的东西相关联

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

【问题讨论】:

  • Promise.all 是您正在寻找的功能。它更像是一个标准化而不是一个单一的图书馆,所以看看部长对 Q 的建议。

标签: javascript jquery ajax backbone.js asynchronous


【解决方案1】:

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

您也可以使用纯 jQuery 来执行此操作。例如:

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

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

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

【讨论】:

  • 如果我有一个 Backbone.Collection 数组,如何使用 Jquery 的 when 方法?
  • 您可以使用旧的 JavaScript apply 方法,并将您的数组应用于 $.when 方法。
  • 值得注意的是,ES6 也有Promise.all
  • @Milo $.when.apply(null, promiseArr).done(function(){ })。每个 fetch 请求都会返回一个 Promise,您可以将它们放在一个数组中并传递给 $.when 函数。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2011-03-14
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多