2010-07-15 19 views
3

J'ai une liste d'URL et j'ai besoin de charger chaque page, l'une après l'autre.
C'est ma fonction principale que j'ai dans mon esprit.Comment faire des appels AJAX synchrones dans greasemonkey?

mainFunction() { 
loop { // Loop through URL list 
oPage = func1(URL); //Get page contents 
aResult = func2(oPage); //Analyse the contents 
func3(aResult); //Do current page modifications 
} 
} 

func1 utilise GM_xmlhttprequest, qui est asynchrone, oPage résultats dans « underfined » en fin de fonction avant le contenu d'une page peuvent être récupérées. GMT_xmlhttprequest utilise également GM_xmlhttprequest, donc même si oPage n'était pas défini, aResult sera aussi indéfini.

Des idées sur comment faire tout ce travail?

func1func2 et func3 doivent être réutilisables dans le script, chacune de ces fonctions peut être utilisée indépendamment ou ensemble dans différentes parties du script.

Répondre

0
var urls = []; 

(function recursive(list) 
{ 
    if (list[0]) // the list is not empty 
    GM_xmlhttpRequest({ // that would be "func1" 
     "url" : list[0], // first url in the list 
     "onload" : function(xhr) 
     { 
      var oPage = xhr.responseText, // page contents 
      aResult = func2(oPage); // analyse the contents 
      func3(aResult); // do current page modifications 

      list.shift(); // remove the first link of the list 
      recursive(list); // go to the next url in the list 
     } 
    }); 
    else 
    alert("end of list"); 
})(urls); 

ont pas testé mais vous eu l'idée

1

Normalement, vous placez les appels dans le gestionnaire de réponse de xmlhttprequest, de sorte qu'il retourne immédiatement, et quand il obtient cette page, il exécute le code requis.

Si vous avez vraiment besoin de les faire se produire dans un ordre précis, vous pouvez faire le retour pour le premier appel de la deuxième, etc.

3

Y at-il des raisons pour lesquelles vous avez besoin d'utiliser des fonctionnalités spécifiques Greasemonkey? Faites-vous des demandes intersites ou quelque chose qui le requiert spécifiquement? En regardant le Wiki pour Greasemonkey, je ne peux pas trouver l'option pour définir asynchronous à false.

Votre option la plus simple est d'inclure JQuery avec votre script Greasemonkey et d'utiliser la fonctionnalité JQuerys AJAX. Bien sûr, cela peut être fait sans JQuery, cependant, l'incompatibilité entre navigateurs dans ce domaine est assez difficile à gérer manuellement.

En utilisant JQuery, votre code ressemblerait à quelque chose comme ceci:

function func1(url) { 
    var result; 

    $.ajax({ 
     type: "GET", 
     url: url, 
     async: false, 
     success: function(data){ 
      result = data; 
     } 
    }); 
    return result; 
} 

et vous déclareront votre variable oPage comme ceci:

var oPage = func1(url); 

Le reste, je pense que vous pouvez comprendre vous-même, bonne la chance.