3

我想知道是否有人知道在发布的事件完成时将事件/回调附加到 dojo 发布的方法。

我将某些内容作为委托任务发布,当委托任务完成时,我想进行一些 UI 更改。

如果你知道怎么做,或者你知道这是不可能的,请告诉我。


编辑:我想如果我能够在事件发布完成后向发布者返回一个值,我也可以做我想做的事。

4

3 回答 3

3

让我们尝试这样的事情

// 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"
  });
});
于 2011-11-09T18:27:14.367 回答
2

我不知道执行此操作的“正确”方法,但您可以尝试使用单独的通道并“按约定”强制连接:

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]);
    });
}
于 2011-11-01T12:49:18.113 回答
0

建立在@Sebastien 的前提下:

//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 是更好的语法糖。

于 2011-11-11T13:29:33.697 回答