example ejemplo javascript ajax

javascript - ejemplo - xmlhttprequest status 0



En AJAX, cómo recuperar la variable desde dentro de onreadystatechange=function() (6)

Esta pregunta ya tiene una respuesta aquí:

¿Es posible recuperar el conjunto de variables en la función onreadystatechange desde fuera de la función?
--editar--
En cuanto a la ejecución de funciones:
Si es posible, me gustaría ejecutar ajaxFunction () con un clic
y luego popup () con el siguiente clic, o de alguna manera espere a que termine la función ajax y luego llame al cuadro de alerta


En pseudocódigo:

function ajaxFunction(){ //creating AJAX ... // Create a function that will receive data sent from the server ajaxRequest.onreadystatechange = function (){ if(ajaxRequest.readyState == 4){ //success code ======>Here i want to set variable <===== var MyVariable=''MyContent''; } } //Retrieving page .... } function popup(){ ajaxFunction(); alert(MyVariable); }


El siguiente código asume que la solicitud ajax es sincrónica:

function popup(){ ajaxFunction(); alert(MyVariable); }

Pero como las solicitudes síncronas están bloqueando el navegador, en casi todos los casos debería usar llamadas asíncronas (si mal no recuerdo, onreadystatechange no debería invocarse en solicitudes sincrónicas, pero diferentes navegadores se comportan de forma diferente)

Lo que podrías hacer es:

function ajaxFunction(callback){ //creating AJAX ... // Create a function that will receive data sent from the server ajaxRequest.onreadystatechange = function (){ if(ajaxRequest.readyState == 4){ //success code callback(''MyContent'') } } //Retrieving page .... } function popup() { ajaxFunction(function(MyVariable){alert(MyVariable);); }


Esto puede complicar su problema así que siéntase libre de intervenir, pero el uso de una biblioteca Javascript de terceros puede ayudar a aliviar su carga levemente (como lo mencionó el comentarista). Prototype y JQuery tienen formas de tratar el alcance, como la función bind en Prototype. Además, no tendrás que escribir tu propio código de solicitud de Ajax, ¡aunque te recomiendo que entres y veas cómo funciona! Las clases de prototipo pueden ayudar con problemas de alcance como los que ha descrito. Es posible que desee refactorizar para poder utilizar solicitudes asíncronas de Ajax, de modo que el navegador no tenga que esperar, como ocurre con la forma en que lo ha escrito. Lo siguiente mostrará su mensaje de alerta y establecerá la variable de manera apropiada, aunque no he probado errores. Sin embargo, muestra el concepto básico.

var TestClass = Class.create(); TestClass.prototype = { MyVariable: null, AjaxURL: "http://yourajaxurl.com/something.asmx", DoAjaxCall: function() { new Ajax.Request(this.AjaxURL, method: ''get'', onSuccess: this.AjaxCallback.bind(this), onFailure: this.DoSomethingSmart.bind(this)); }, AjaxCallback: function(returnVal) { this.MyVariable = returnVal.responseText; //ResponseText or whatever you need from the request... this.Popup(this.MyVariable); }, DoSomethingSmart: function() { //Something smart }, Popup: function(message) { alert(message); } }; var TestClassInstance = new TestClass(); TestClassInstance.DoAjaxCall();


¿Por qué no cambiar el alcance de MyVariable a fuera de la función?

var MyVariable; function ajaxFunction(){ //creating AJAX ... // Create a function that will receive data sent from the server ajaxRequest.onreadystatechange = function (){ if(ajaxRequest.readyState == 4){ //success code ======>Here i want to set variable <===== MyVariable=''MyContent''; } } //Retrieving page .... } function popup(){ ajaxFunction(); alert(MyVariable); }


Pase la variable a la función emergente ():

var MyVariable; function ajaxFunction(){ //creating AJAX ... // Create a function that will receive data sent from the server ajaxRequest.onreadystatechange = function (){ if(ajaxRequest.readyState == 4){ //success code ======>Here i want to set variable <===== MyVariable=''MyContent''; popup(MyVariable); } } //Retrieving page .... } function popup(x){ ajaxFunction(); alert(x); }


algunos comentarios son correctos ... esto no tiene nada que ver con el alcance variable, y todo tiene que ver con el hecho de que la función interna (la función ''onreadystatechange'') que establece el valor de MyVariable no se habrá ejecutado cuando la alerta () sucede ... por lo que la alerta siempre estará vacía.

La función interna no se ejecuta de forma síncrona (es decir, de inmediato), sino que se difiere y se ejecuta más tarde, cuando la solicitud retorna, que es mucho después de que se haya ejecutado la alerta (). La única solución para esto es diferir la alerta hasta que finalice la solicitud.

Pero independientemente de todo esto, la función interna puede establecer variables fuera de su alcance, como se menciona en las otras publicaciones. Pero su problema es más sobre el orden de ejecución que sobre el alcance de la variable.


No, porque MyVariable tiene un alcance para la función. Para que sea visible en popup() , debe tener un ámbito donde tanto la función del controlador de eventos como popup() puedan verla, como recomienda Jenp .