Неопределенная переменная при преобразовании тернарного оператора в традиционный оператор if

Я использую eslint для исправления некоторых стандартов кодирования в своем базовом приложении. У меня есть следующая функция в представлении (упрощенный код):

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         self.trigger(doUpdate === false ? "foo" : "bar");
      });
   }
}

Мне нужно преобразовать троичный оператор в стандартный оператор if. Итак, я попробовал это:

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         self.trigger(function(){
            if(doUpdate === false) {
               return "foo";
            }

            return "bar";
         });
      });
   }
}

К сожалению, это, кажется, вызывает проблемы в коде. Интересно, правильно ли я ссылаюсь на doUpdate. Где я ошибся в этом преобразовании?

3 ответа

Решение

В оригинальном коде trigger вызывается со значением "foo" или же "bar",

В вашем обновленном коде trigger вызывается с функцией.

Вы никогда не вызывали функцию, которую вы заменили условной.

Я бы оставил условную версию, но если вы хотите использовать альтернативу, вызовите вашу функцию:

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         self.trigger(function(){
            if(doUpdate === false) {
               return "foo";
            }

            return "bar";
         }());
//        ^^--------------- Note
      });
   }
}

Если вам нужно удалить условное выражение, я бы так не поступил. Вместо:

getData: function(foo){
   var self = this;
   $.when(foo).then(function(){
      var doUpdate = false;

      self.makeAjaxRequest().done(function(data){
         var triggerWith;
         if (doUpdate === false) {
            triggerWith = "foo";
         } else {
            triggerWith = "bar";
         }
         self.trigger(triggerWith);
      });
   }
}

Примечание: если у вас нет реальной необходимости специально проверять false а не различные другие ложные значения, которые, похоже, не имеют место в этом коде, просто if (!doUpdate) скорее, чем if (doUpdate === false) это обычный способ.

Почему бы не использовать предложение if непосредственно перед вызовом self.trigger?

self.makeAjaxRequest().done(function(data) {
    if (doUpdate) {
        self.trigger("bar");
    } else {
        self.trigger("foo");
    }
});

Я немного заржавел в своей Backbone, но на самом деле невозможно использовать Backbone.Events.trigger с функцией в качестве аргумента. Однако вы можете превратить его в iife (или сделать его именованной функцией).

self.trigger((function(){
    if(doUpdate === false) {
        return "foo";
    }

    return "bar";
}()));

или как именованная функция

function getUpdateEventName(doUpdate) {
    if(doUpdate === false) {
        return "foo";
    }

    return "bar";
}

self.trigger(getUpdateEventName(doUpdate));
Другие вопросы по тегам