Tengo una función javascript que verifica si existe un artista en un archivo 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¿Tengo razón al pensar que la línea 'return true' debería dejar de ejecutar la función? Pensé que lo haría, pero después de encontrar un registro y ejecutar la primera alerta, la ejecución continúa con la alerta de falla en la parte inferior.
¿Qué estoy haciendo mal, por favor? Gracias.
Sí, "deja" la ejecución de la función. La pregunta es, "¿qué función?" En este caso, la respuesta debería ser bastante clara: es la función que se pasa a .each() .
Puede terminar el comportamiento de bucle de .each() devolviendo false en lugar de true , pero eso aún no lo sacará de la función externa. Lo que probablemente debería considerar es configurar una variable local en la función externa y configurar la función interna cuando encuentre algo (y luego romper el bucle .each() ). Luego, la función principal puede verificar la variable local para ver si se configuró.
Este es un caso en el que realmente me gustaría usar una .reduce() o .inject() , pero jQuery no tiene una y realmente se oponen a ella.
Devuelve false , en lugar de true , para terminar each ciclo; de los documentos :
Podemos detener el bucle desde la función de devolución de llamada devolviendo
false.
Sin embargo, eso solo terminará each ciclo, no la función general. Tendrá que establecer una bandera para saber si encontró algo, por ejemplo, algo como esto:
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$.get es una función asíncrona, lo que significa que la función principal, artistExists , regresará inmediatamente y se iniciará una solicitud GET. Para poder obtener el resultado, necesitará una devolución de llamada.
function artistExists(artist, cb) { $('.loading').show(); $.get(artists_xml, function(xml) { var found = false; $('.loading').hide(); $(xml).find('artist').each(function(){ if ($(this).find("ar_artist").text() == artist.val()) { found = true; return false; // use return false to stop .each() } }); // the built in action. if (found) { alert ('artist exists'); } else { alert ('artist does not exist'); } // call the callback function cb (found); }); }Luego, para usar, necesita usar una función de devolución de llamada. Desde
var isExists = artistExists('lol'); // do stuffNecesitas cambiarlo a:
artistExists('lol', function(isExists) { // do stuff });