2012-10-10 19 views
6

He escrito una función ajax genérica simple que puede ser invocada por múltiples funciones en mi script. No estoy seguro de cómo devolver los datos a la función ajax a la persona que llama.jQuery ajax-- devolver datos a la función de llamada

// some function that needs ajax data 
function myFunction(invoice) { 
    // pass the invoice data to the ajax function 
    var result = doAjaxRequest(invoice, 'invoice'); 
    console.dir(result); // this shows `undefined` 
} 

// build generic ajax request object 
function doAjaxRequest(data, task) { 
    var myurl = 'http://someurl'; 
    $.ajax({ 
     url: myurl + '?task=' + task, 
     data: data, 
     type: 'POST', 
     success: function(data) { 
      console.dir(data); // this shows good data as expected 
      return data; // this never gets back to the calling function 
     } 
    }); 
} 

¿Hay alguna manera de devolver los datos ajax a la función de llamada?

+2

No. La función de llamada ha terminado de ejecutarse antes de la llamada AJAX se inició aun. Podrías hacerlo sincrónico ... pero luego no es AJAX. – TheZ

+0

¿No pudo pasar una función de devolución de llamada (posiblemente anónima) a la función 'doAjaxRequest' y luego invocarla desde el cierre exitoso? –

+0

@ TheZ-- mierda-- obvio ahora. ¡Gracias por la ayuda con una pregunta tonta! – julio

Respuesta

11

$.ajax es asincrónico, por lo que para recuperar los datos deberá pasar una devolución de llamada a su función doAjaxRequest. Agregué un parámetro de devolución de llamada al doAjaxRequest y en lugar de usar el resultado de doAjaxRequest, el código que maneja la respuesta está en la función de devolución de llamada.

// some function that needs ajax data 
function myFunction(invoice) { 
    // pass the invoice data to the ajax function 
    doAjaxRequest(invoice, 'invoice', function (result) { 
     console.dir(result); 
    }); 
} 

// build generic ajax request object 
function doAjaxRequest(data, task, callback) { 
    var myurl = 'http://someurl'; 
    $.ajax({ 
     url: myurl + '?task=' + task, 
     data: data, 
     type: 'POST', 
     success: function(data) { 
      console.dir(data); // this shows good data as expected 
      callback(data); 
     } 
    }); 
} 
+0

@ Brigham-- ¡gracias! Eso funciona perfectamente. – julio

-1

Creo ayuda completo a usted este ejemplo

function testAjax() { 
    var result=""; 
    $.ajax({ 
     url:"getvalue.php", 
     async: false, 
     success:function(data) { 
     result = data; 
     } 
    }); 
    return result; 
} 

function fun2() 
{ 

alert(testajax()) 

} 

observa una cosa asíncrono: falsa

Cuestiones relacionadas