jQuery条件递延

问题描述 投票:0回答:1

我有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. 但在第二种情况下,我只需要一个模型API调用(即myModel1.fetch())......所以在这种情况下,解析将只依赖于myModel1Deferred + myViewDeferred。

我的问题是,我是否应该有一个if条件,然后写上 "如果"。$.when().then() 每个条件都单独处理,或者可以在一个单一的 $.then().when().

javascript jquery jquery-deferred deferred
1个回答
0
投票

你可以 传递一个可变长度的数组给 $.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, …]);
});

顺便说一下,与其说是 多次延期 你的 fetchrequire 函数应该简单地返回承诺,而不是接受回调。

© www.soinside.com 2019 - 2024. All rights reserved.