Неопределенная переменная при преобразовании тернарного оператора в традиционный оператор 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));