【问题标题】:How to make synchronous AJAX calls in greasemonkey?如何在greasemonkey中进行同步AJAX调用?
【发布时间】:2010-07-15 16:49:56
【问题描述】:

我有一个 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 会在函数结束之前导致“underfined”,然后才能检索到页面的内容。
func2 也使用 GM_xmlhttprequest,所以即使 oPage 是未定义,aResult 也将未定义。

关于如何完成所有这些工作的任何想法?

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

【问题讨论】:

    标签: javascript ajax greasemonkey synchronous gm-xmlhttprequest


    【解决方案1】:

    您是否有任何理由需要使用 Greasemonkey 特定功能?您是在做跨站点请求还是特别需要它的东西?查看 Greasemonkey 的 Wiki,我找不到将 asynchronous 设置为 false 的选项。

    您最简单的选择是在您的 Greasemonkey 脚本中包含 JQuery 并使用 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);
    

    其余的我想你可以自己解决,祝你好运。

    【讨论】:

      【解决方案2】:

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

      如果您确实需要让它们按特定顺序发生,您可以将第一个调用的返回设置为第二个调用,依此类推。

      【讨论】:

        【解决方案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);
        

        尚未测试,但您知道了

        【讨论】:

          猜你喜欢
          • 2016-09-17
          • 1970-01-01
          • 2020-02-23
          • 2021-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多