¿Cómo puedo devolver un valor desde GM_xmlhttprequest?
-
22-08-2019 - |
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?
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);
}