2

Me gustaría recoger la respuesta de la siguiente llamada ajax:

function prueba(callback){

       $.ajax({
            url: '/services/traps/view/',
            type: "POST",
            data: {
                csrfmiddlewaretoken: csrftoken
            },
            success: callback ,
            error: function(qXHR, textStatus, errorThrown) {
                console.log(errorThrown);
                console.log(qXHR);
                console.log(textStatus);

            },
        });
    };

function mycallback(data){
  //mi código
};

var mydata = prueba(mycallback);

En este caso, mydata devuelve undefinded. Quiero recogerla para manipularla después con jquery.

Didina Deen
  • 53
  • 1
  • 9

2 Answers2

2

Hay varios problemas en el código por los que vas a obtener undefined en la variable mydata:

  1. La función prueba no devuelve nada

    Estás asignando a mydata el valor de la función prueba... pero prueba no devuelve nada, por lo que mydata será siempre undefined.

  2. Quieres realizar una asignación síncrona de un valor asíncrono

    Éste es el verdadero problema. La función AJAX se ejecuta de manera asíncrona (se realiza la llamada al servidor y se ejecuta success/error cuando vuelve la respuesta) pero la asignación es síncrona; por lo tanto, incluso si prueba devolviera un valor, no funcionaría porque ese valor aún no se habría asignado antes de devolverlo.

Posibles soluciones: puedes cambiar la función para que devuelva un valor y realizar la llamada AJAX de manera síncrona (haciendo async:false). De esta manera te aseguras de que el valor sí estará ahí cuando lo devuelvas. Esta opción no es la mejor y no es la recomendada.

Otra alternativa mejor sería empaquetar el código que haga uso de la variable mydata en una función y llamarla en mycallback (donde se asigna el valor de mydata):

function prueba(callback){

       $.ajax({
            url: '/services/traps/view/',
            type: "POST",
            data: {
                csrfmiddlewaretoken: csrftoken
            },
            success: callback ,
            error: function(qXHR, textStatus, errorThrown) {
                console.log(errorThrown);
                console.log(qXHR);
                console.log(textStatus);

            },
        });
    };

function mycallback(data){
  //mi código
  mydata = data;
  operacionesConMyData();
};

function operacionesConMyData() {
    // mover aqui las operaciones que necesiten mydata
}

// llamada al AJAX
prueba(mycallback);
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
  • 1
    Deberías poner un `var mydata` para que el OP y los futuros lectores sepan en que ámbito léxico se debe declarar esa variable. De lo contrario podría intentar declararla en el lugar incorrecto y pensar que la solución que le diste no funciona ;-) – devconcept Mar 31 '16 at 13:38
-1

Sin utilizar callback. podes tomar el valor del retorno en el success

function prueba(callback){

       $.ajax({
            url: '/services/traps/view/',
            type: "POST",
            data: {
                csrfmiddlewaretoken: csrftoken
            },
            success: function (retorno) {
          // El retorno contendra la información 

        },
            error: function(qXHR, textStatus, errorThrown) {
                console.log(errorThrown);
                console.log(qXHR);
                console.log(textStatus);

            },
        });
    };
  • ¿Cómo responde esto a la pregunta? OP hace lo mismo pero de manera diferente (la función `mycallback` es llamada cuando ocurre el success y el parámetro `data` es equivalente a `retorno`) – Alvaro Montoro Mar 31 '16 at 11:36
  • Y cual es el error?, supuestamente las dos funciones hacen lo mismo. yo aporte una alternativa. No tengo el código completo para probar si funciona o no. – Ariel Octavio D'Alfeo Mar 31 '16 at 11:45
  • El error está en el código mostrado, no hace falta código adicional – Alvaro Montoro Mar 31 '16 at 11:57