【问题标题】:Prototype Ajax.Request only calling the last callback原型 Ajax.Request 只调用最后一个回调
【发布时间】:2010-12-18 02:53:15
【问题描述】:

我正在为使用 Prototype 的网站编写用户脚本。我决定使用已经加载的 Prototype 函数,而不是使用 GM 库(主要是为了我可以轻松地将其重新用于 Chrome)。

我正在遍历表格的各行,每行都表示一个唯一的用户,方法是检查他们的个人资料页面上的在线状态元素。

dom = unsafeWindow; //shortening unsafewindow

console.log("main start");
var rows = dom.$$("#users tbody>tr");
var users = dom.$$("#users tbody>tr .user_avatar");
console.log(rows);
for (var i=0; i < users.length; i++) {
    var row = rows[i];
    var user = users[i];
    new dom.Ajax.Request("/users/" + user["title"] + ".html", { //user["title"] is the username
            method:'get',
            onSuccess:     function(response) {
                                var state = "offline";
                                if (response.responseText.indexOf("now_online") > -1) {
                                    state = "online";
                                }
                                row.childElements()[1].innerHTML += "<br /><b>" + state + "</b>";
                        }, 
            onFailure:    function(request) {
                            row.childElements()[1].innerHTML += "<br /><b>Error</b>";
                        }
        }
    );
}

观察在 Firebug 中执行的脚本,我看到所有 GET 都返回状态为 200 的有效响应主体。但是,“在线”仅显示在最后一行。似乎没有调用前几行的回调。我已经用每行之后的 console.log 语句验证了这一点。

我搜索并发现 FB 和 Firefox 3.5 如何处理多个 Ajax.Requests http://code.google.com/p/fbug/issues/detail?id=1948 存在问题。我升级到最新的 Firebug 测试版并拥有最新的非测试版 Firefox,但仍然没有骰子。即使我完全禁用了 FB,也会出现问题。

在这一点上我几乎是空白,所以我愿意接受任何和所有建议。谢谢。

【问题讨论】:

  • 这是一个常见问题解答。见stackoverflow.com/questions/1061622/…
  • “元素”从何而来?它是如何实例化的?
  • @o.k.w:感谢您的捕获 - 元素是我将代码从函数移回主 ajax 回调的结果。 @Chetan:感谢您的链接,但我认为这不是关闭问题。我已经用 console.log 语句替换了回调的内容,尽管发出了所有请求,但我仍然只看到最后一行得到回调。

标签: javascript firefox dom prototypejs xmlhttprequest


【解决方案1】:

尝试使用function.bind() 设置范围/添加变量。

        onSuccess:     function(response) {
                            var state = "offline";
                            if (response.responseText.indexOf("now_online") > -1) {
                                state = "online";
                            }
                            arguments[0].innerHTML += "<br /><b>" + state + "</b>";
                    }.bind(this,row), 

编辑:或查看This Way Of Doing It

【讨论】:

  • 我无法绑定到这样的函数。唯一可能在这些情况下起作用的绑定技术是,如果我可以执行 ajaxReq.onSuccess.bind(this, row),但在我实例化 onSuccess 的那一刻,请求就会发出。
  • 对不起,我不明白你为什么不能这样绑定;函数“bind”返回一个函子,这正是 onSuccess 参数所期望的。
  • 我不能像这个函数(param) { ... }.bind(scope vars)那样调用bind,我得到js错误。
  • 这很奇怪,我已经多次使用该约定而没有错误,介意分享一下这是什么浏览器/版本吗?另外,尝试用括号括住函数声明以手动序列化它,例如onSuccess: (function () {}).bind(this,...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 2013-04-28
  • 2011-01-26
  • 2012-08-02
相关资源
最近更新 更多