2012-08-11 15 views
25
function ajax_test(str1){ 
    var url = "None" 
    jq.ajax({ 
    type:'post', 
    cache: false, 
    url: 'http://....' + str1, 
    success: function(data, status, xhr){ 
     url=data; 
    }, 
    error: function (xhr, status, e) { 
    }, 
    async: true, 
    dataType: 'json' 
    }); 
    return url 
} 

¿Cómo puedo configurar la variable global url para que sea el resultado devuelto de los datos ajax?jquery ajax éxito de la llamada, ¿cómo puedo cambiar una variable global en la función envoltura javascript?

+0

que tiene que hacer algo con 'url' una sola vez el éxito se lanza? – NicoSantangelo

+0

No es global, porque tiene la palabra clave var delante de él. Creo que te refieres al alcance exterior. – maximus

+0

¡Gracias por las prontas respuestas! @maximus sí alcance externo es lo que quise decir. Tengo una URL válida, acabo de sacar la parte de detalles. – sammiwei

Respuesta

24

en JavaScript, es imposible que una función para return un resultado asíncrona. La función generalmente regresará antes de que se realice la solicitud AJAX.

Siempre puede forzar que su solicitud sea sincrónica con async: false, pero generalmente no es una buena idea porque hará que el navegador se bloquee mientras espera los resultados.

La manera estándar de evitar esto es mediante el uso de una función de devolución de llamada.

function ajax_test(str1, callback){ 
    jq.ajax({ 
    //... your options 
    success: function(data, status, xhr){ 
     callback(data); 
    } 
    }); 
} 

y luego se le puede llamar así:

ajax_test("str", function(url) { 
    //do something with url 
}); 
+0

Puede que esto no sea lo que OP solicitó específicamente, pero es la forma correcta de hacer las cosas. +1 –

+0

Hay una contradicción en sus primeros 2 párrafos. Es imposible devolver un resultado asincrónico [a menos que se use 'async: false', que debe evitarse a menos que sea estrictamente necesario, como se explica en el segundo párrafo]. Aunque está bastante bien explicado. –

+0

@ FabrícioMatté No, no es una contradicción porque si usas 'async: false', entonces ya no es asíncrono. –

2

Aquí está mi código de ejemplo para recuperar datos de php, y luego pasar el valor de una variable global dentro de la función javascript ajax éxito. ¡Esto funciona para mi!

var retVal = null; 

function ajaxCallBack(retString){ 
    retVal = retString; 
} 

function readString(filename){ 
    $.ajax({ 
     type: "POST", 
     url: "readString.php", 
     data: { 'fn': filename },  
     success: function(response){ 
      ajaxCallBack(response); 
     } 
    }); 
} 

código PHP (readString.php):

<?php 

    $fn = $_POST['fn']; 

    $file = fopen("path/".$fn.".record","r"); 
    $string = fread($file,filesize("path/".$fn.".record")); 
    fclose($file); 

    echo $string; 
?> 

Sin embargo, como .ajax $() enviado solicitudes de forma asíncrona, lo que significa que puede volver antes de ejecutar el éxito de devolución de llamada, usted no debe confiar en se ejecuta secuencialmente y devuelve el valor por sí mismo. Por lo tanto, aquí asignamos el valor de respuesta de php al valor global en la función de devolución de llamada.

Cuestiones relacionadas