2016-11-14 2 views
0

я написал метод следующим образом:Почему эта часть кода всегда возвращает «no_conflict»?

detectNameConflict: function() { 
    var existing_filenames = this.element.find('ul.existing_files > li'); 
    if (existing_filenames.length > 0) { 
     var try_name = this.element.find('div.target_filename').text().trim(); 
     existing_filenames.each(function(index, el) { 
      if ($(el).text() == try_name) { 
       return "contain_conflict"; 
      } 
     }); 
    } else { 
     return "no_conflict"; 
    } 
}, 

Этот код не работает, потому что он всегда возвращается «no_conflict», даже когда есть конфликт имен.

примечание: this.element - от фабрики виджета jQueryUI. Он относится к элементу DOM, на котором подключен экземпляр виджета.

+0

Кстати, это многокамерного точка возврата считается плохой практикой в ​​JavaScript? –

+2

Множественные точки возврата вполне приемлемы, но они не работают из внутренних вложенных функций. Ваш '' contains_conflict "' не возвращается из внешней функции, он возвращается из внутренней функции, которую вы создали. – 4castle

+0

Единственное, что '.each()' использует возвращаемое значение для принятия решения о продолжении цикла. Если вы вернете «false», цикл остановится, иначе он продолжит движение. – Barmar

ответ

1

Вы можете преобразовать коллекцию jQuery в массив, а затем использовать Javascript some(), чтобы проверить, соответствует ли какой-либо из них try_name.

detectNameConflict: function() { 
    var try_name = this.element.find('div.target_filename').text().trim(); 
    var existing_filenames = this.element.find('ul.existing_files > li').toArray(); 
    if (existing_filenames.some(function(el) { 
     return $(el).text() == try_name; 
    })) { 
     return "contain_conflict"; 
    } else { 
     return "no_conflict"; 
    } 
} 
+0

Является ли этот «предикат вместо процедуры» только в Javascript? Я никогда не видел такой проблемы в Python. Хотя я признаю, что я новичок для обоих языков. Просто хочу прояснить эту часть знаний. Спасибо. –

+0

В Python, если вы вызываете лямбду из другой функции, а лямбда имеет 'return', она просто вернется из лямбды, а не вызывающей функции. – Barmar

-1

Ваше возвращение заявление для "contain_conflict" выходит предикат, а не процедура в целом, так что каждый продолжает цикл после того, как обнаруживаются конфликт. Вам нужно либо использовать цикл for, либо поток управления на основе исключений (поскольку JavaScript не хватает goto).

Update

Бармен указал в комментариях выше, что вы можете остановить зацикливание, возвращая false из вашего предиката. Предпочитайте исключения; Я не знал об этой функциональности, когда писал этот ответ.

End Update

для цикла:

detectNameConflict: function() 
{ 
    var existing_filenames = this.element.find('ul.existing_files > li'); 
    if (existing_filenames.length > 0) 
    { 
     var try_name = this.element.find('div.target_filename').text().trim(); 
     for(var filename in existing_filenames) 
     { 
      if ($(filename).text() == try_name) 
      { 
       return "contain_conflict"; 
      } 
     } 
    } 
    return "no_conflict"; 
} 

Исключение на основе потока:

detectNameConflict: function() 
{ 
    var existing_filenames = this.element.find('ul.existing_files > li'); 
    if (existing_filenames.length > 0) 
    { 
     var try_name = this.element.find('div.target_filename').text().trim(); 
     try 
     { 
      existing_filenames.each(function(index, el) 
       { 
        if ($(el).text() == try_name) 
        { 
         throw "contain_conflict"; 
        } 
       }); 
     } 
     catch(e) 
     { 
      return e; 
     } 
    } 
    return "no_conflict"; 
} 
+0

Не учитывает реальную проблему OPs – epascarello

+0

@epascarello: Уточните? –

+0

* потому что он всегда возвращает «no_conflict» * - означает, что он всегда находится в else ... означает, что оператор if всегда false – epascarello

Смежные вопросы