Pregunta

Tengo este código aquí:

var infiltrationResult;

while(thisOption) {
    var trNode = document.createElement('tr');
    var tdNode = document.createElement('td');
    var hrefNode = document.createElement('a');

    infPlanetID = thisOption.getAttribute('value');

  var myURL = "http://www.hyperiums.com/servlet/Planetinf?securitylevel=90&newinfiltr=New+infiltration&planetid=" + PlanetID + "&infplanetid=" + infPlanetID;

    GM_xmlhttpRequest({
        method: 'GET',
        url: myURL,
        headers: {
            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
            'Accept': 'application/atom+xml,application/xml,text/xml',
        },
        onload: function(responseDetails) {
                if (responseDetails.responseText.match(/<b>Invalid order<\/td><\/tr><tr><td><BR><center><font color=#AAAA77 face=verdana,arial size=2>The target planet is blocking all infiltrations[\s\S]<BR><BR>/im)) {
                    // Successful match
                    infiltrationResult = 'Invalid Order';
                } else {
                    // Match attempt failed
                    infiltrationResult = 'Infiltration Successfully Created';
                }
        }
    });

Cuando agrego

  

alerta (infiltrationResult);

justo después de que se le asigna, me veo correctamente la cadena.

Sin embargo, después de la función ha salido, tengo tratar la misma alerta y me sale:

undefined

Alguna idea de lo que estoy haciendo mal?

¿Fue útil?

Solución

La solicitud se ejecuta de forma asíncrona. Eso es ¿Por qué La función toma una función de devolución de llamada onload en el primer lugar. Si fuera síncrono, y luego GM_xmlhttpRequest simplemente devolvería los detalles de respuesta como una función ordinaria.

A la espera de la solicitud para volver, el código después de la llamada a GM_xmlhttpRequest sigue funcionando. La secuencia de comandos que identifica correctamente infiltrationResult no está definido porque la solicitud no se ha completado todavía.

Si necesita hacer algo más que simplemente asignar la variable cuando la solicitud se vuelve, a continuación, hacer que en la devolución de llamada onload.

Otros consejos

Prueba esto:

var infiltrationResult;

while(thisOption) {
    var trNode = document.createElement('tr');
    var tdNode = document.createElement('td');
    var hrefNode = document.createElement('a');

    infPlanetID = thisOption.getAttribute('value');

  var myURL = "http://www.hyperiums.com/servlet/Planetinf?securitylevel=90&newinfiltr=New+infiltration&planetid=" + PlanetID + "&infplanetid=" + infPlanetID;

    GM_xmlhttpRequest({
        method: 'GET',
        url: myURL,
        headers: {
            'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
            'Accept': 'application/atom+xml,application/xml,text/xml',
        },
        onload: function(responseDetails) {
                        if (responseDetails.responseText.match(/<b>Invalid order<\/td><\/tr><tr><td><BR><center><font color=#AAAA77 face=verdana,arial size=2>The target planet is blocking all infiltrations[\s\S]<BR><BR>/im)) {
                                // Successful match
                                infiltrationResult = 'Invalid Order';
                        } else {
                                // Match attempt failed
                                infiltrationResult = 'Infiltration Successfully Created';
                        }
                        sentback(infiltrationResult);//Sent it when it loads only
        }
    });

function sentback(x){
    alert(x);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top