Por lo tanto, se ha hecho esta pregunta un millón de veces, y estoy seguro de que todo el mundo (yo incluido) tried this once.
Es sólo la naturaleza de una llamada asincrónica, no se puede utilizar sus resultados como un valor return
. Es por eso que te hacen pasar una función que obtiene el resultado de la llamada, ¡tampoco pueden return
! Observe también que la llamada elqTracker.pageTrack()
función devuelve inmediatamente, por lo tanto su returnValue
es simplemente undefined
.
mayoría de las personas (véase la respuesta de dfsq) soluciona este problema mediante la introducción de una función de devolución de llamada como parámetro de. Este método es probado, y verdadero – sin embargo jQuery tiene $.Deferred
. Esto le permite hacer su propia lógica asíncrona devuelve un promise
que luego se puede adjuntar cualquier número de devoluciones de llamada a:
function trackPage(){
var elqTracker = new jQuery.elq(459),
dfd = $.Deferred();
elqTracker.pageTrack({
success: function() {
elqTracker.getGUID(function(guid) {
dfd.resolve(guid);
});
}
});
return dfd.promise();
}
// example use:
trackPage().done(function(guid) {
alert("Got GUID:" + guid);
});
Aviso ahora que su trackPage()
devuelve un objeto que se puede adjuntar a las devoluciones de llamada? No tiene que adjuntarlos inmediatamente tampoco.
var pageHit = trackPage().done(function(guid) {
alert("Page Hit GUID:" +guid);
});
$("button").click(function() {
pageHit.done(function(guid) {
alert("Clicked on Page GUID:" + guid);
});
});
Además, el módulo de jQuery AJAX siempre devuelve promesas, así, por lo que la interfaz para todas sus cosas AJAX debe ser muy similar si usted hace sus propias promesas de retorno lógica.
Como nota al margen: Me gustaría señalar que su var returnValue
estaba en el mal "alcance" de todos modos. Necesita ser declarado en el ámbito externo de la función trackPage
. Incluso con esta solución, el concepto aún no funciona.
es 'getGUID' una llamada asincrónica? – Anurag
no estoy seguro. Es una llamada a un complemento de otra JS (no es una llamada que pueda modificar). Puedo alertar el valor ... e incluso asignarlo a una nueva variable. Simplemente puedo obtener ese valor fuera del función – patrick
Definitivamente suena asíncrono, en ese caso. –