Javascript 主干的竞争条件。收集获取

Javascript 主干的竞争条件。收集获取,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,我正在生成所选月份的日期列表,在该列表中,我将为每个日期创建一个Backbone.Collectionfetch 下面是我如何循环一个月内的每个日期 for (var i = 1; i <= numOfDays; i++) { var d = i < 10 ? '0'+i:i; var v = new View({ dt: this.year + this.month + (d), param: this.array });

我正在生成所选月份的日期列表,在该列表中,我将为每个日期创建一个
Backbone.Collection
fetch

下面是我如何循环一个月内的每个日期

for (var i = 1; i <= numOfDays; i++) {
   var d = i < 10 ? '0'+i:i;
   var v = new View({
      dt: this.year + this.month + (d),
      param: this.array
   });      
   this.$el.append(v.render().el);
}
稍后它将启动一个新的
backbone.collection
对象,并立即执行fetch

reading: function (value, key) {
   var _this = this;
   this.fetchData(new Data.Collection(), '/api/ + value.ipid').done(function(coll) {
      var input = $('<input>').val(value.ipid).attr('data-inid', coll.first().get('in_id'));
      _this.$el.append(input);
   });
}
不幸的是,对于每个视图,
param
对象中项目的顺序将发生变化,因为它取决于
主干.ajax
的竞争条件。让我们看看
param
对象的项目

[{ipid: 44, measure: "cumec"},{ipid: 45, measure: "meter"},{ipid: 46, measure: "milimeter"}{ipid: 47, measure: "cumec"}]
对象项的顺序正确。44、45、46和47。但是,在最初传递列表时获取列表将在fetch操作后更改

如何让backbonejs或下划线JS在开始循环
param
对象中的另一项之前等待每个提取操作完成

[{ipid: 44, measure: "cumec"},{ipid: 45, measure: "meter"},{ipid: 46, measure: "milimeter"}{ipid: 47, measure: "cumec"}]
我只希望循环(\每个)在继续循环之前等待获取操作完成


希望有人能为实现这一目标提供启发。谢谢您,祝您愉快

如果您在视图创建时创建并附加DOM元素(即在
reading
函数中),然后从done回调中引用,则元素的顺序将与param数组中的顺序相同


旁注:您可以直接用url实例化
集合
,而无需将另一个jQuery承诺包装在fetch返回的承诺周围。

我认为您的问题的解决方案是使用,因此您的代码如下所示:

async.eachSeries(this.param, _.bind(this.reading, this), yourCallbackWhenTheArrayIsFinished);

reading: function (value, callback) {
   var _this = this;
   this.fetchData(new Data.Collection(), '/api/ + value.ipid').done(function(coll) {
      var input = $('<input>').val(value.ipid).attr('data-inid', coll.first().get('in_id'));
      _this.$el.append(input);
      callback();
   });
}
async.eachSeries(this.param,u.bind(this.reading,this),完成时回调);
读取:函数(值、回调){
var_this=这个;
this.fetchData(new Data.Collection(),'/api/+value.ipid').done(函数(coll){
var input=$('').val(value.ipid).attr('data-inid',coll.first().get('in_id'));
_此.$el.append(输入);
回调();
});
}

因此,在从done处理程序调用callback()之前,eachSeries不会处理下一个元素

如果您发布创建集合的视图代码并获取其内容,以获得整个图片的句柄,这将非常有用。您好,感谢您的回复。请参阅以上更新的问题。谢谢您的回复。我不明白你的答案。然而,我更新了我的问题。您可以看到我附加了
$el
,您需要将
var input=$(“”)
this.$el.append(input)
移出已完成的回调。
async.eachSeries(this.param, _.bind(this.reading, this), yourCallbackWhenTheArrayIsFinished);

reading: function (value, callback) {
   var _this = this;
   this.fetchData(new Data.Collection(), '/api/ + value.ipid').done(function(coll) {
      var input = $('<input>').val(value.ipid).attr('data-inid', coll.first().get('in_id'));
      _this.$el.append(input);
      callback();
   });
}