Как сделать синхронные вызовы AJAX в greasemonkey?
У меня есть список URL-адресов, и мне нужно загружать каждую страницу одну за другой.
Это моя основная функция, которую я имею в своем уме.
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 приводит к "недоопределению", поскольку функция завершается ДО того, как содержимое страницы может быть получено.func2
также использует GM_xmlhttprequest, поэтому даже независимо от того, был ли oPage неопределенным, aResult также будет неопределенным.
Любые идеи о том, как сделать все это работает?
func1
func2
а также func3
должны быть многократно использованы в скрипте, каждая из этих функций может использоваться независимо или вместе в разных частях скрипта.
3 ответа
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);
не проверял, но у вас есть идея
Есть ли какая-то причина, по которой вам нужно использовать специальные функции Greasemonkey? Вы делаете межсайтовые запросы или что-то, что конкретно требует этого? Глядя на вики для Greasemonkey, я не могу найти возможность установить asynchronous
ложно.
Самый простой вариант - включить 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);
В остальном я думаю, вы сами можете разобраться, удачи.
Обычно вы помещаете вызовы в обработчик ответа xmlhttprequest, так что он немедленно возвращается, а когда он получает эту страницу, он выполняет необходимый код.
Если вам действительно нужно, чтобы они происходили в определенном порядке, вы можете сделать возврат для первого звонка, второго и т. Д.