Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript return not breaking out of function

Tags:

I have a javascript function which checks to see if an artist exists in an XML file:

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

Am I right in thinking that the 'return true' line should quit execution of the function? I thought it would, but after finding a record and running the first alert execution continues to the failure alert at the bottom.

What am I doing wrong please? Thank you.

like image 432
RichJohnstone Avatar asked Jan 23 '11 14:01

RichJohnstone


People also ask

Does return break the function?

A return statement ends the execution of a function, and returns control to the calling function. Execution resumes in the calling function at the point immediately following the call.

Does return terminate a function JavaScript?

The return statement stops the execution of a function and returns a value.

What is return () in JavaScript?

The return statement ends function execution and specifies a value to be returned to the function caller.

How do you escape a function in JavaScript?

Sometimes when you're in the middle of a function, you want a quick way to exit. You can do it using the return keyword. Whenever JavaScript sees the return keyword, it immediately exits the function and any variable (or value) you pass after return will be returned back as a result.


2 Answers

Yes, it does "quit" execution of the function. The question is, "which function?" In this case the answer should be pretty clear: it's the function passed to .each().

You can terminate the looping behavior of .each() by returning false instead of true, but that still won't get you out of the outer function. What you should probably consider is to set up a local variable in the outer function, and have the inner function set that when it finds something (and then break the .each() loop). Then the main function can check the local variable to see if it was set.

This is a case where I'd really like to use a .reduce() or .inject() API, but jQuery doesn't have one and they're really opposed to it.

like image 125
Pointy Avatar answered Oct 14 '22 04:10

Pointy


Return false, rather than true, to terminate the each loop; from the docs:

We can stop the loop from within the callback function by returning false.

That will just terminate your each loop, though, not the overall function. You'll need to set a flag so you know whether you found something, e.g. something like this:

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
like image 32
T.J. Crowder Avatar answered Oct 14 '22 03:10

T.J. Crowder