2009-07-28 24 views
73

código JavaScript que estoy empezando con:

function doSomething(url) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     success: rssToTarget 
    }); 
}  

patrón me gustaría utilizar:

//where elem is the target that should receive new items via DOM (appendChild) 
function doSomething(url, elem) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     success: rssToTarget(elem) 
    }); 
} 

no creo que puedo conseguir la devolución de llamada a trabajar de esta manera, ¿verdad? ¿Cuál es el patrón apropiado? No quiero usar necesariamente variables globales para mantener temporalmente el nombre elem o elem.

+0

http://stackoverflow.com/questions/2602981/jquery-how-to-pass-additional-parameters-to-success-callback-for-ajax-call use invokedata –

+0

Para referencia futura: necesita almacenar el función de devolución de llamada ('rssToTarget') dentro de la propiedad' success' del literal del objeto que está pasando a '$ .ajax()', por lo que jQuery puede llamar a esa función una vez que se completa la solicitud AJAX. Al agregar '(elem)' al final del nombre de la función, está invocando erróneamente 'rssToTarget' y almacenando su valor de retorno dentro de' success'. En JS, al agregar paréntesis al final de un nombre de función lo invocará. – BrunoFacca

Respuesta

94

Así ...

function doSomething(url, elem) { 
    $.ajax({ 
    type: "GET", 
    url: url, 
    dataType: "xml", 
    success: function(xml) { 
     rssToTarget(xml, elem); 
    } 
    }); 
} 

respuesta a tu comentario: Does use of anonymous functions affect performance?

+3

aha +1. ¿Paga algún precio de rendimiento por crear funciones anón en todas partes? – BuddyJoe

+2

Y supongo que realmente sería .... success: function (xml) {rssToTarget (xml, elem); } – BuddyJoe

+0

Si está de acuerdo, ¿puede actualizar la respuesta? Gracias Josh – BuddyJoe

30

El patrón desea utilizar podría funcionar si se crea un closure dentro de su función rssToTarget:

function rssToTarget(element) { 
    return function (xmlData) { 
    // work with element and the data returned from the server 
    } 
} 

function doSomething(url, elem) { 
    $.ajax({ type: "GET", 
     url: url, 
     dataType: "xml", 
     success: rssToTarget(elem) 
     }); 
} 

Cuando se ejecuta rssToTarget(elem), el parámetro del elemento se almacena en el closure, y la función de devolución de llamada se devuelve ned, esperando ser ejecutado.

+0

-1 No puede establecer el éxito de una función que devuelve una función. –

+0

Olvidé agregar "pero requiere un parámetro" –

+3

por supuesto, puede devolver una función ¡compruebe el código en ejecución! http://jsbin.com/anepo/edit – CMS

Cuestiones relacionadas