jQuery条件延迟

时间:2014-09-12 07:37:01

标签: javascript jquery jquery-deferred deferred

我有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个独立的案例(基于如何访问视图);

  
      
  1. 在第一种情况下,我有两个模型API调用...所以在这种情况下,resolve将依赖于myModel1Deferred + myModel2Deferred +   myViewDeferred
  2.   
  3. 但在第二种情况下,我只需要一个模型API调用(即myModel1.fetch())...所以在这种情况下,解析只依赖于   myModel1Deferred + myViewDeferred
  4.   

我的问题是我应该有if条件并为每个条件分别写$ .when()。then()或者可以在单个$ .then()中处理。当()

请建议。

1 个答案:

答案 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您的fetchrequire函数应该只返回promises,而不是接受回调。