2009-02-08 8 views
4

J'ai ce code ici:Comment puis-je renvoyer une valeur à GM_xmlhttprequest?

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 affectation, je vois correctement la chaîne.

Cependant, après que la fonction a quitté, j'ai essayer la même alerte et je reçois:

undefined 

Toutes les idées ce que je fais mal?

Répondre

7

La requête s'exécute de manière asynchrone. C'est pourquoi la fonction prend une fonction de rappel onload en premier lieu. Si elle était synchrone, alors GM_xmlhttpRequest retournerait simplement les détails de réponse comme une fonction ordinaire.

En attendant le retour de la demande, le code après l'appel à GM_xmlhttpRequest continue à s'exécuter. Votre script identifie correctement que infiltrationResult est indéfini car la requête n'est pas encore terminée.

Si vous devez faire plus que simplement affecter la variable lorsque la demande revient, faites-le dans le rappel onload.

+0

Vous étiez tout à fait raison. Déplacer le code qui a singé avec ce résultat dans la fonction a tout fixé. Merci! G-Man – GeoffreyF67

1

Essayez ceci:

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); 
} 
Questions connexes