Управление контекстом функций обратного вызова

В главе 2 была представлена функция hitch, которая может использоваться, чтобы обеспечить выполнение некоторой функции в определенном контексте. Довольно часто функция hitch используется совместно с объектом XHR, потому что иногда требуется, чтобы контекст функции обратного вызова отличался от контекста блока программного кода, в котором она вызывается. Следующий фрагмент демонстрирует один из случаев применения функции hitch и представляет собой типичный шаблон использования псевдонима для ссылки this, чтобы решить проблему контекста в функции обратного вызова:
//Предположим, что имеется следующий блок addOnLoad block,
//который фактически может быть любым объектом JavaScript
dojo.addOnLoad(function() {
//объект foo связан с контекстом этой анонимной функции
this.foo = "bar";
//создать псевдоним для "this", чтобы на него можно было
//ссылаться внутри функции load...
var self=this;
dojo.xhrGet({
url : "./data",
load : function(response, ioArgs) {
//для обращения к объекту foo внутри этой функции
//следует использовать псевдоним "this"...
console.log(self.foo, response);
},
error : function(response, ioArgs) {
console.log("error", response, ioArgs);
}
});
});

Хотя в этом коротком примере все выглядит достаточно понятным, но программный код, в котором для работы многократно создавались новые объекты – псевдонимы контекста this, будет выглядеть беспорядочным.


В следующий раз, когда вам потребуется создать псевдоним для this, подумайте о применении следующего шаблона, в котором используется функция hitch:
dojo.addOnLoad(function() {
//объект foo связан с контекстом этой анонимной функции
this.foo = "bar";
//связать контекст функции обратного вызова с текущим контекстом,
//чтобы иметь возможность обращаться к объекту foo
var callback = dojo.hitch(this, function(response, ioArgs) {
console.log("foo (in context) is", this.foo);
//и в вашем распоряжении все еще имеются response и ioArgs...
});
dojo.xhrGet({
url : "./data",
load : callback,
error : function(response, ioArgs) {
console.log("error", response, ioArgs);
}
});
});

И не забывайте, что функция hitch может принимать дополнительные аргументы, благодаря чему вы легко и просто можете передавать ей любые параметры, которые должны быть доступны в функции обратного вызова, например так:
dojo.addOnLoad(function() {
//объект foo связан с контекстом этой анонимной функции
this.foo = "bar";
//связать контекст функции обратного вызова с текущим контекстом,
//чтобы иметь возможность обращаться к объекту foo
var callback = dojo.hitch(
this,
function(extraParam1, extraParam2, response, ioArgs) {
console.log("foo (in context) is", this.foo);
//и в вашем распоряжении все еще имеются response и ioArgs...
},
"extra", "params"
);
dojo.xhrGet({
url : "./data",
load : callback,
error : function(response, ioArgs) {
console.log("error", response, ioArgs);
}
});
});

Если число параметров может изменяться, вы можете использовать для доступа к ним свойство arguments, не забывая, что два последних значения – это аргументы response и ioArgs..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
DeferredList
JSON
OpenAjax Hub
Внедрение объектов Deferred в функции XHR
Вызов удаленных процедур