2016-11-14 74 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 Widget工厂。它指向附加了窗口小部件实例的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中,如果您从另一个函数调用lambda,并且lambda具有'return',它将从lambda返回,而不是调用函数。 – Barmar

-1

"contain_conflict"你return语句退出谓语,而不是过程作为一个整体,所以在检测到冲突后各继续循环。您需要使用for循环或基于异常的控制流(请参见JavaScript缺少goto)。

更新

巴曼指出,在上面的评论,你可以从你的谓词返回false停止循环。喜欢例外;当我写这个答案时,我并不知道这个功能。

末更新

for循环:

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

不考虑OP的实际问题 – epascarello

+0

@epascarello:谨慎地阐述? –

+0

*因为它总是返回“no_conflict”* - 表示它总是在else中意味着if语句总是为假 – epascarello

相关问题