Javascript返回没有突破功能

Ric*_*one 13 javascript jquery

我有一个javascript函数,它检查XML文件中是否存在艺术家:

function artistExists(artist) {
// get data from artists.xml 
$('.loading').show();
$.get(artists_xml, function(xml){  
    $('.loading').hide();
    $(xml).find('artist').each(function(){
        if ($(this).find("ar_artist").text() == artist.val()) {
            alert ('artist exists');
            return true;
        } //end if
    });  // end each
    alert ('artist does not exist');
    return false;
}); // end .get function
} // end of artistExists function
Run Code Online (Sandbox Code Playgroud)

我是否正确地认为'return true'行应该退出函数的执行?我以为会这样,但是在找到记录并运行第一个警报后,执行继续到底部的故障警报.

我做错了什么?谢谢.

Poi*_*nty 16

是的,它确实"退出"了该功能的执行.问题是,"哪个功能?" 在这种情况下,答案应该非常明确:它是传递给的函数.each().

您可以.each()通过返回false而不是返回来终止循环行为true,但仍然不会让您退出外部函数.你应该考虑的是在外部函数中设置一个局部变量,并在找到内容时设置内部函数(然后打破.each()循环).然后main函数可以检查局部变量以查看它是否已设置.

这是一个我真的想使用.reduce().inject()API的情况,但jQuery没有,他们真的反对它.


T.J*_*der 15

返回false,而不是true终止each循环; 来自文档:

我们可以通过返回来停止回调函数中的循环false.

但这将终止你的each循环,而不是整体功能.你需要设置一个标志,以便你知道你是否找到了一些东西,例如:

function artistExists(artist) {
// get data from artists.xml 
$('.loading').show();
$.get(artists_xml, function(xml){  
    var found = false;    // <== Added
    $('.loading').hide();
    $(xml).find('artist').each(function(){
        if ($(this).find("ar_artist").text() == artist.val()) {
            alert ('artist exists');
            found = true; // <== Added
            return false; // <== Modified
        } //end if
    });  // end each
    if (!found) {         // <== Added
        alert ('artist does not exist');
    }                     // <== Added
    return found;         // <== Modified
}); // end .get function
} // end of artistExists function
Run Code Online (Sandbox Code Playgroud)