我有2个独立的模型,由2个不同的API调用填充。我一个接一个地获取它们,一旦模型api调用完成并且我的视图可用(然后触发延迟解析),我有视图渲染逻辑,即将数据写入视图
以下是代码;
var myModel1 = new myModel1({
attr1: attr1
});
var myModel2 = new myModel2({
attr2: attr2
});
myModel1.fetch({
success: function() {
myModel1Deferred.resolve(myModel1);
}
});
myModel2.fetch({
success: function() {
myModel2Deferred.resolve(myModel2);
}
});
require(['view/my-view'], function(myView) {
myViewDeferred.resolve(myView);
});
$.when(myModel1Deferred, myModel2Deferred, myViewDeferred).then(function(myModel1, myModel2, myView) {
// My view rendering logic
}
现在的问题是有2个独立的案例(基于如何访问视图);
- 在第一种情况下,我有两个模型API调用...所以在这种情况下,resolve将依赖于myModel1Deferred + myModel2Deferred + myViewDeferred
- 但在第二种情况下,我只需要一个模型API调用(即myModel1.fetch())...所以在这种情况下,解析只依赖于 myModel1Deferred + myViewDeferred
醇>
我的问题是我应该有if条件并为每个条件分别写$ .when()。then()或者可以在单个$ .then()中处理。当()
请建议。
答案 0 :(得分:0)
您可以pass an array of variable length to $.when
使用apply
。像
var promises = [
myViewDeferred,
myModel1Deferred
];
if (case#2)
promises.push(myModel2Deferred);
$.when.apply($, promises).then(function(view) {
view.render.apply(view, Array.prototype.slice.call(arguments, 1));
// view.render(model1, [model2, …]);
});
顺便说一句,而不是using many deferreds您的fetch
和require
函数应该只返回promises,而不是接受回调。