骨干网竞态.获取集合
Race Condition of Backbone.Collection fetch
我在选定的月份生成日期列表,其中对于每个日期,我将进行Backbone.Collection
取回。
下面是我如何循环一个月中的每一个日期
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.view
)将代表一个date
和param object
。然后在调用render()
_.each
方法循环param
对象_.each(this.param, this.reading, this);
,然后它将启动一个新的backbone.collection
对象,并执行立即获取。
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);
});
}
我像这样分离函数this.fetchData
fetchData: function (obj, url) {
var deferred = $.Deferred(),
collection = obj;
collection.url = url;
var xhr = collection.fetch().done(function(data, textStatus, jqXHR) {
deferred.resolve(collection, data, textStatus, jqXHR);
}).fail(deferred.reject);
var promise = deferred.promise();
promise.abort = _.bind(xhr.abort, xhr);
return promise;
}
不幸的是,对于每个视图, param
对象内item的顺序将发生移位,因为它取决于backbone.ajax
的竞争条件。让我们看看param
对象
[{ipid: 44, measure: "cumec"},{ipid: 45, measure: "meter"},{ipid: 46, measure: "milimeter"}{ipid: 47, measure: "cumec"}]
对象项顺序正确。44 45 46 47。但是为了在初始传递时获取清单,将在fetch操作之后进行更改。
如何告诉backbonejs或下划线在开始循环param
对象中的另一个项之前等待每个取操作完成
我只是希望循环( __each )在继续循环
之前等待取操作完成希望有人能启发实现这一目标的方法。谢谢大家,祝大家今天愉快。
如果在视图创建时创建并附加DOM元素(即在reading
函数中),那么从done回调内部引用,元素将以与param数组相同的顺序。
旁注:你可以直接用url实例化collection
,不需要在fetch返回的承诺周围包装另一个jQuery承诺。
我认为你的问题的解决方案是使用Async.js库提供的迭代器,所以你的代码看起来像:
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();
});
}
因此,直到从done处理程序调用callback()之前,eachSeries不会处理下一个元素
相关文章:
- 如何使用backbone.js从集合中获取模型名称
- 主干-从模板中迭代的集合中获取特定的模型
- 获取Href的集合
- 尝试从集合中获取特定模型
- Backbone集合:如何从API中获取特定对象以放置在模型中
- 如何获取jQuery集合中的第k个元素..作为JQUERY元素
- 所需响应的主干无限集合获取调用
- Backbonejs最简单的集合获取
- 主干.js:仅添加来自 JSON 集合获取的新模型
- 我无法使用 lodash _.template 从一个主干视图中的多个集合获取数据
- Backbone.js集合获取'这个_byId'未定义
- 使用特定的ajax调用设置集合获取
- 在 Backbone 中使用相同类型的集合获取不同的模型集
- 使用主干集合获取数据子集
- 主干集合获取选项不影响GET请求
- 从backbone.js集合获取model.id使用Tastypie创建成功调用
- Onchange集合获取错误而不是函数
- 主干集合获取抛出id错误
- 从mongodb集合获取所有文档时出错
- 从服务器上的Meteor集合获取项目会抛出“;可以't wait without Fiber”;