Как сделать синхронные вызовы AJAX в greasemonkey? - PullRequest
4 голосов
/ 15 июля 2010

У меня есть список 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 ]

3 голосов
/ 17 июля 2010

Есть ли какая-то причина, по которой вам нужно использовать специальные функции 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);

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

1 голос
/ 15 июля 2010

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

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

0 голосов
/ 07 августа 2010
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);

еще не проверял, но у вас есть идея

...