2011-11-01 52 views
3

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

我发布了一些委托任务,当委托任务完成时,我想进行一些UI更改。

让我知道如果你知道如何或如果你知道这是不可能的。


编辑: 我想我还可以做什么,我想,如果我能返回一个值给出版商事后公布结束。

+0

对于那些提出延期解决方案的人,我有一个问题。如果我正在修改订阅者的代码,那么当订阅者完成时发布事件不是更好,因为这个事件对任何可能需要它的人都是可用的吗? – hbhakhra

+0

我认为这一切都取决于用户完成消费发布的消息时需要知道什么。如果只有一件事(最初的发布者)需要做某件事,那么也许使用“延迟”将是最有意义的。如果多个不相交的实体需要在用户完成消费时执行一些工作,则发布到另一个主题可能是最有意义的。 – BuffaloBuffalo

+0

谢谢大家的答案。虽然延期的答案很好,可能是更好的练习,但对于我的使用,由于没有真正的方法来附加回调,我只是要发布回调请求。 – hbhakhra

回答

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]); 
    }); 
} 
+0

我也可以访问我发布的功能,但我认为它可能会变得杂乱,所以我想我会尽量避免它。 – hbhakhra

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" 
    }); 
}); 
+0

这看起来可能会起作用。当我有机会时,我会尝试一下 – hbhakhra

0

大厦:

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