【问题标题】:Why does this piece of code always return "no_conflict"? [duplicate]为什么这段代码总是返回“no_conflict”? [复制]
【发布时间】:2017-03-28 16:39:51
【问题描述】:

我写了一个方法如下:

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 元素。

【问题讨论】:

  • 顺便问一下,这种多返回点模式在 Javascript 中被认为是不好的做法吗?
  • 多个返回点是完全可以接受的,但它在嵌套函数内部不起作用。您的 "contain_conflict" 不是从外部函数返回,而是从您创建的内部函数返回。
  • .each() 唯一使用返回值的就是决定是否继续循环。如果您返回false,则循环停止,否则继续。
  • 它返回no_conflict 的唯一时间是existing_filenames 为空。当length > 0时,返回undefined
  • console.log() 是你的朋友,看看为什么支票永远无效。好像var existing_filenames = this.element.find('ul.existing_files > li'); 正在返回 0 个项目

标签: javascript jquery return


【解决方案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";
    }
}

【讨论】:

  • 这个“退出谓词而不是过程”的东西只在 Javascript 中吗?我从未在 Python 中看到过这样的问题。虽然我承认我是两种语言的初学者。只是想澄清一下这方面的知识。谢谢。
  • 在 Python 中,如果你从另一个函数调用 lambda,并且 lambda 有 return,它只会从 lambda 返回,而不是从调用函数。
【解决方案2】:

"contain_conflict" 的 return 语句退出谓词,而不是整个过程,因此每个在检测到冲突后都会继续循环。您需要使用for 循环或基于异常的控制流(因为JavaScript 缺少goto)。

更新

Barman 在上面的 cmets 中指出,您可以通过从谓词中返回 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";
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
相关资源
最近更新 更多