3

У меня есть список URL-адресов и вам нужно загружать каждую страницу один за другим.
Это моя главная функция, которую я имею в своем Разуме.Как сделать синхронные вызовы AJAX в 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 использует GM_xmlhttprequest, который является асинхронным, так oPage результаты в «underfined», как функция заканчивается до содержимое страницы может быть восстановлена.
func2 также использует GM_xmlhttprequest, поэтому даже независимо от того, была ли oPage не определена, aResult также не будет определен.

Любые идеи о том, как сделать все это?

func1func2 и func3 должны быть повторно использованы во всем скрипте, каждая из этих функций может использоваться независимо или совместно в разных частях скрипта.

ответ

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); 

не проверял, но вы получили идею

1

Обычно вы отправляете вызовы внутри обработчика ответа xmlhttprequest, чтобы он немедленно возвращался, и когда он получает эту страницу, он выполняет требуемый код.

Если вам действительно нужно, чтобы сделать их произошло в определенном порядке, вы можете сделать возврат для первого вызова второго и т.д.

3

Есть ли причина, почему вы должны использовать Greasemonkey специфическую функциональность? Вы выполняете кросс-сайты или что-то, что конкретно требует? Глядя на Wiki на Greasemonkey, я не могу найти способ установить asynchronous на false.

Ваш самый простой вариант - включить JQuery с вашим сценарием Greasemonkey и использовать функциональность JQuerys AJAX. Конечно, это можно сделать без JQuery, однако кросс-браузерная несовместимость в этой области - это большая проблема для обработки вручную.

Использование JQuery, ваш код будет выглядеть примерно так:

function func1(url) { 
    var result; 

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

и вы бы объявить переменную oPage так:

var oPage = func1(url); 

Остальное я думаю, вы можете выяснить сами, хорошо удачи.

Смежные вопросы