jQuery условно отличается разрешением

У меня есть 2 модельных объекта и вид. Я использую отложенный, чтобы решить эти. Теперь, когда представление всегда будет там, у меня может быть один или оба объекта модели для разрешения в зависимости от условия. Ниже приведен код;

var self = this,
myDeferred1 = new $.Deferred(),
myDeferred2 = new $.Deferred(),
viewDeferred = new $.Deferred();

if (typeof personId !== "undefined") {
    var myObj1 = new MyObj1({
        attr1  : attrId1,
        attr2   : personId
    });

    myObj1.fetch({
        success: function() {
            myDeferred1.resolve(myObj1);
        }
    });
}

var myObj2 = new MyObj2({
        attr1  : attrId1
    });

myObj2.fetch({
    success: function() {
        myDeferred2.resolve(myObj2);
    }
});


require(['myView'], function(MyView) {
                viewDeferred.resolve(MyView);
            });

$.when(myDeferred1, myDeferred2, viewDeferred).then(function(myObj1, myObj2, MyView) {

});         

У меня такой вопрос, поскольку myDeferred1 будет отображаться только условно (typeof personId!== "undefined")

как проверить то же самое при выполнении

$.when(myDeferred1, myDeferred2, viewDeferred).then(функция (myObj1, myObj2, MyView)

Должен ли я повторить код, выполнив, если..else... как показано ниже ИЛИ есть ли лучший способ сделать это?

if (typeof personId !== "undefined") {          
    $.when(myDeferred1, myDeferred2, viewDeferred).then(function(myObj1, myObj2, MyView) {
    });         
} else {
    $.when(myDeferred2, viewDeferred).then(function(myObj2, MyView) {
    });         
}

1 ответ

Вы можете добавить else пункт, чтобы решить myDeferred1 немедленно.

if (typeof personId !== "undefined") {
    //... as in question
} else {
    myDeferred1.resolve({});
}

Разрешив с пустым простым объектом, вы можете проверить myObj1.attr1 а также myObj1.attr2, не бросая ошибку.

Например:

$.when(myDeferred1, myDeferred2, viewDeferred).then(function(myObj1, myObj2, MyView) {
    if(myObj1.attr1 && myObj1.attr2) {
        // personId *was not* undefined 
    } else {
        // personId *was* undefined 
    }
});

Или если personId все еще находится в области действия (и гарантированно не изменилось во время асинхронного действия), затем просто проверьте if(personId !== undefined) снова.

Другие вопросы по тегам