【问题标题】:jQuery Conditional DeferredjQuery 条件延迟
【发布时间】:2014-11-06 07:53:27
【问题描述】:

我有 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
}

现在的问题是有两种不同的情况(基于视图的访问方式):

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

我的问题是我应该有一个 if 条件并为每个条件分别编写 $.when().then() 还是可以在单个 $.then().when() 内处理。

【问题讨论】:

    标签: javascript jquery jquery-deferred deferred


    【解决方案1】:

    您可以使用applypass an array of variable length to $.when。类似的东西

    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, …]);
    });
    

    顺便说一句,你的 fetchrequire 函数应该简单地返回承诺,而不是接受回调,而不是 using many deferreds

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2019-09-27
      • 2011-12-17
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多