Javascript: Как мне сохранить ссылку на инициатор запроса в обработчике? - PullRequest
1 голос
/ 07 июля 2010

Я обычно не человек из Javascript, но я углубился в чтение книги Дугласа Крокфорда и написание некоторых тривиальных полезных лакомых слов в качестве расширений Chrome и Node.js (обратите внимание, что этот вопрос не касается ни одного из них).

Сейчас я пытаюсь выяснить, как сохранить ссылку на объект, инициирующий запрос AJAX, а именно: как только я установлю обработчик события onload (это изнутри расширения Chrome, поэтому я используя базовый объект XMLHttpRequest), есть ли способ вернуться к MyObject в следующем примере:

MyObject.prototype = {
    PerformAction: function() {
        this.Request = new XMLHttpRequest();
        this.Request.open("GET", this.ConstructUrl(), true);
        // From within ActionResultHandler, 'this' will always be the XMLHttpRequest
        this.Request.onload = this.ActionResultHandler,
        this.Request.send(null);
    }
}

Выполнение этого точно назначит this самим объектом запроса, и если я просто введу оболочку:

this.Request.onload = function() { ActionResultHandler() };

ну, это просто не будет ничего делать , потому что ActionResultHandler теперь выходит за рамки. Причина, по которой я спрашиваю здесь, состоит в том, что я нашел только тривиальные случаи манипулирования вызывающими (например, манипулирование тем, на что ссылается this изнутри функции), но, учитывая, что Oav-ified Javascript и AJAX буквально повсюду, это должно Должна быть известная, простая проблема, но мой Google-фу подводит меня здесь. В C # события вызываются в контексте того, кто к ним присоединяется, а не объекта, инициирующего событие, поэтому это не происходит ежедневно. Возможно, есть гораздо лучший шаблон JS, который полностью избегает этой проблемы?

Ответы [ 2 ]

4 голосов
/ 08 июля 2010

Мне не совсем понятно, на какую переменную вы хотите хранить ссылку. Вот как вы бы сохранили ссылку на MyObject в своем обработчике загрузки:

MyObject.prototype = {
    PerformAction: function() {
        var MyObjectRef = MyObject,
            ActionResultHandler = this.ActionResultHandler;

        this.Request = new XMLHttpRequest();
        this.Request.open("GET", this.ConstructUrl(), true);
        // From within ActionResultHandler, 'this' will always be the XMLHttpRequest
        this.Request.onload = function () {
                ActionResultHandler.apply(MyObjectRef, arguments);
            };
        this.Request.send(null);
    }
}

Отредактированный

Хорошо, я перечитал ваш вопрос еще раз, и кажется, что вы хотите выполнить ActionResultHandler в контексте MyObject, поэтому я настроил свой код для этого.

1 голос
/ 08 июля 2010

Вы пробовали ...

this.Request.onload = this.ActionResultHandler.apply(this);

Я думаю, это то, что вы ищете (извините, если это не так).Использование .apply(this) укажет ActionResultHandler на Object.

Изучите эту статью о связывании, пока вы на нем!Это мне очень помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...