Comment puis-je renvoyer une valeur de GM_XMLHTTPREQUEST?
-
22-08-2019 - |
Question
J'ai ce code ici:
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';
}
}
});
Quand j'ajoute
alerte (infiltrationResult);
Juste après son attribution, je vois correctement la chaîne.
Cependant, après la sortie de la fonction, j'ai essayé la même alerte et j'obtiens:
undefined
Des idées que je fais de mal?
La solution
La demande fonctionne de manière asynchrone. C'est Pourquoi La fonction prend un onload
Fonction de rappel en premier lieu. S'il était synchrone, alors GM_xmlhttpRequest
Retournerait simplement les détails de la réponse comme une fonction ordinaire.
En attendant le retour de la demande, le code après l'appel à GM_xmlhttpRequest
continue de courir. Votre script identifie correctement cela infiltrationResult
n'est pas défini car la demande n'est pas encore terminée.
Si vous devez faire plus que simplement attribuer la variable lorsque la demande revient, alors faites-le dans le onload
rappeler.
Autres conseils
Essaye ça:
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);
}