Javascript 如何在greasemonkey中进行同步AJAX调用?

Javascript 如何在greasemonkey中进行同步AJAX调用?,javascript,ajax,greasemonkey,synchronous,gm-xmlhttprequest,Javascript,Ajax,Greasemonkey,Synchronous,Gm Xmlhttprequest,我有一个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_xmlhttpre

我有一个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未定义,结果也将未定义

关于如何使所有这些工作顺利进行,有什么想法吗


func1
func2
func3
应该可以在整个脚本中重用,这些函数可以单独使用,也可以在脚本的不同部分一起使用。

通常,您会将调用放在xmlhttprequest的响应处理程序中,以便它立即返回,当它确实获得该页面时,它就会执行所需的代码


如果您确实需要按照特定的顺序执行这些操作,您可以在第一次呼叫时返回第二次呼叫,等等。

您有什么理由需要使用Greasemonkey特定的功能吗?您是在做跨站点请求还是有特殊要求?查看for Greasemonkey,我找不到将
asynchronous
设置为false的选项

最简单的选择是将Greasemonkey脚本包括在内,并使用JQuerysAjax功能。当然,这可以在没有JQuery的情况下完成,但是,手动处理这方面的跨浏览器不兼容是相当痛苦的

使用JQuery,您的代码将如下所示:

function func1(url) {
    var result;

    $.ajax({
        type: "GET",
        url: url,
        async: false,
        success: function(data){
            result = data;
        }
    });
    return result;
}
var oPage = func1(url);
您可以这样声明变量
oPage

function func1(url) {
    var result;

    $.ajax({
        type: "GET",
        url: url,
        async: false,
        success: function(data){
            result = data;
        }
    });
    return result;
}
var oPage = func1(url);
剩下的我想你自己能搞定,祝你好运

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);
还没有测试过,但你已经有了想法