Прикрепить обратный вызов к публикации - PullRequest
3 голосов
/ 01 ноября 2011

Мне было интересно, знает ли кто-нибудь о способе прикрепления события / обратного вызова к публикации додзё после завершения публикуемого события.

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

Дайте мне знать, если вы знаете, как или если вы знаете, что это невозможно.


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

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Давайте попробуем что-то вроде этого

// publisher side
var d = new dojo.Deferred();
dojo.publish("my/channel",[d]);
// ... do some extra asynchronous work , server request ...
result = goterror ? "error" : "ok";
if (!error) d.callback(result); else d.errback(result);

// listener side
dojo.subscribe("my/channel",function(d) {
  // let's wait for the server to respond ( or maybe its already done )
  d.then(function(result) {
    // result is "ok"
  },function(params) {
    // result is "error"
  });
});
2 голосов
/ 01 ноября 2011

Я не знаю "правильного" способа сделать это, но вы можете попробовать использовать отдельный канал и принудительно установить соединение "по соглашению":

dojo.subscribe('fooChannel', function(){
     ....
     dojo.publish('fooChannelComplete', [...]);
});

Вспомогательная функция, чтобы сделать это болеебесшовные:

function add_to_foo(f){
    dojo.subscribe('fooChannel', function(){
        var ret = f.apply(this, arguments);
        dojo.publish('fooChannelComplete', [ret]);
    });
}
0 голосов
/ 11 ноября 2011

Опираясь на предпосылку @ Себастьяна:

//publisher
var deferred = new Dojo.deferred();
var successFunction = function(){
  console.log('task succesfully completed');
};

var errorFunction = function(){
  console.log('task did not succesfully complete');
};
//when our deferred object is done, invoke either successFunction or errorFunction
dojo.when(deferred, successFunction, errorFunction);

dojo.publish("someTopic",[deferred]);




//topic subscriber code
dojo.subscribe("someTopic",function(deferred) {
  //do whatever delegated task is needed.
  //...

  //task completed successfully, invoke the `successFunction` defined on the publisher
  deferred.callback();  

  //or if task did not complete successfully invoke `errorFunction` defined on the publisher
  //deferred.errback();

});

Та же предпосылка, но с использованием dojo.when, что IMO - лучший синтаксический сахар.

...