代码之家  ›  专栏  ›  技术社区  ›  user1651105

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

  •  4
  • user1651105  · 技术社区  · 14 年前


    这是我脑子里的主要功能。

    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
    func2 还使用GM xmlhttprequest,因此即使oPage未定义,结果也将未定义。

    有什么办法让这一切顺利吗?

    功能2 func3 如果在整个脚本中都可以重用,那么这些函数中的每一个都可以单独使用,也可以在脚本的不同部分中一起使用。

    3 回复  |  直到 14 年前
        1
  •  0
  •   w35l3y    14 年前
    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);
    

    还没测试过,但你有主意了

        2
  •  3
  •   Anders    14 年前

    有什么理由需要使用Greasemonkey特定的功能吗?你是在做跨站点的请求还是特别需要它?在看 Wiki 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);
    

    剩下的我想你自己能搞定,祝你好运。

        3
  •  1
  •   zebediah49    14 年前

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