Прототип Ajax.Request только вызывает последний обратный вызов - PullRequest
0 голосов
/ 19 ноября 2009

Я пишу пользовательский скрипт для сайта, который использует Prototype. Вместо того чтобы использовать библиотеки GM (в основном, чтобы я мог легко перенастроить его для Chrome), я решил использовать уже загруженные функции Prototype.

Я перебираю строки таблицы, каждая из которых обозначает уникального пользователя, проверяя наличие онлайн-элемента статуса на странице их профиля.

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.

На данный момент я в значительной степени рисую пробел, поэтому я открыт для любых предложений. Спасибо.

1 Ответ

0 голосов
/ 19 ноября 2009

попробуйте использовать 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), 

РЕДАКТИРОВАТЬ: или проверить Этот способ сделать это

...