【问题标题】:How to make one AJAX request after a number of Backbone saves如何在多次 Backbone 保存后发出一个 AJAX 请求
【发布时间】:2012-10-26 17:41:28
【问题描述】:

我有一种情况,我需要保存一个 Backbone 模型,然后在它成功时遍历一个集合并保存它们,然后在每个成功时遍历另一个集合并保存它们,然后在所有这些都完成后执行一个AJAX 请求。这就是我所拥有的:

backboneModel.save(
    {},
    {
         wait: true,
         success: function (model1, response1)
         {
              $.each(backboneCollection1.models, function () {
                    this.save(
                        {},
                        {
                             wait: true,
                             success: function (model2, response2)
                             {
                                  $.each(backboneCollection2.models, function () {
                                       this.save(
                                           {},
                                           {
                                                wait: true,
                                                success: function (model2, response2)
                                                {
                                                     //If i put the AJAX request here it will happen for every iteration which is not desired
                                                }
                                           });
                                  });
                              }
                         });
               });
               //If i put the AJAX request here it will fire after one iteration of the first each even with async set to false on the AJAX request
         }
   });

是否有人对在何处执行此 AJAX 请求有任何建议,以便在所有主干模型保存到服务器后仅触发一次?

【问题讨论】:

  • 我认为最大的问题是结构设置错误。一方面,您的最后一次收藏保存实际上将进行 N 次保存,数量级为主干Collection1.length。因此,如果 collection1.length 为 10 且 collection2.length 为 5,您将进行 10 次调用以将模型保存在 collection1 中,但进行 50 次调用以仅将 5 个模型保存在 collection2 中。我正在尝试为您提供一个使用 jQuery 承诺并执行您正在尝试的解决方案,但我正在工作,所以可能需要一段时间。

标签: jquery ajax backbone.js


【解决方案1】:

看看我创建的这个jsfiddle。它取代了您的成功回调并使用承诺来保存您的模型,然后是集合 1,然后是集合 2。一旦所有这些都完成了,您就可以在 done() 中进行 ajax 调用。

大部分更改是用这个替换上面的内容。

var saveEverything = backboneModel.save()
.pipe(function() { return saveCollection(backboneCollection1); })
.pipe(function() { return saveCollection(backboneCollection2); });
saveEverything.done(function() { console.log('done with everything, ajax time') });//make your ajax call in the done

如果您不知道 jQuery 承诺是什么,this 是一篇非常棒的博客文章,它解释了承诺。如果我的例子根本没有任何意义,或者只是问,我可以尝试解释正在发生的事情和正在发生的事情。

【讨论】:

  • 我以前从未听说过 promise,但 .pipe 函数似乎正是我想要的。唯一的问题是backboneCollection2 是backboneCollection1 中模型的一个属性,这就是我嵌套保存的原因。因此,当一个模型保存集合 1 时,我获得了该模型的某个属性并将所有内容保存在该集合中......似乎很容易使用您发布的内容谢谢!
  • 啊,没发现backboneCollection2 是backboneCollection1 上的一个属性。您应该能够使用我所拥有的,但将第二个管道更改为循环通过主干集合 1 并调用相同的方法 (saveCollection) 并传递嵌套的主干集合。
【解决方案2】:

在遍历模型时进行计数,当计数 = 模型长度时,调用 AJAX

【讨论】:

  • 保持计数工作正常,但我正在寻找与 fiskers7 发布的答案类似的更多内容。谢谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2018-11-05
  • 2017-09-01
相关资源
最近更新 更多