У меня возникли проблемы с работой функции обратного вызова. Вот мой код:Проблема определения с помощью обратного вызова Javascript
SomeObject.prototype.refreshData = function()
{
var read_obj = new SomeAjaxCall("read_some_data", { }, this.readSuccess, this.readFail);
}
SomeObject.prototype.readSuccess = function(response)
{
this.data = response;
this.someList = [];
for (var i = 0; i < this.data.length; i++)
{
var systemData = this.data[i];
var system = new SomeSystem(systemData);
this.someList.push(system);
}
this.refreshList();
}
В основном SomeAjaxCall делает запрос ajax для данных. Если он работает, мы используем callback 'this.readSuccess', и если он терпит неудачу 'this.readFail'.
Я понял, что это «this» в SomeObject.readSuccess является глобальным (как объект окна), потому что мои обратные вызовы вызывается как функции, а не методы-члены. Я понимаю, что мне нужно использовать закрытие, чтобы сохранить «это», однако я не смог заставить это работать.
Если кто-то может показать мне, что я должен делать, я был бы очень признателен. Я все еще обдумываю, как работают замыкания, и конкретно, как они будут работать в этой ситуации.
Спасибо!
Действительно , то, что происходит здесь, заключается в том, что 'obj' блокируется в замыкании, создаваемом при' function() {obj.readSuccess(); } '. Нет другого способа сделать это, если вы не используете такую библиотеку, как Prototype или jQuery; они имеют функцию '.bind()', которая будет делать создание закрытия прозрачно. – MvanGeest
Не для nit-pick, но для потомков StackOverflow версия jQuery называется «прокси», а не «bind». – Pointy
Идеальный смысл. Прокси-функция jQuery работает, это здорово. Для полноты, однако, я все еще немного смущен, как бы я справился с этим, если бы не использовал jQuery. В моем примере readSuccess имеет 1 аргумент, respnse, который заполняется позднее. Поэтому мне не имеет смысла говорить function() {obj.readSuccess (wah ??); } так как вау ??? должен быть передан позже. Я попробовал функцию() {obj.readSuccess; } без везения. Есть предположения? – nazbot