我想知道是否有人知道在发布的事件完成时将事件/回调附加到dojo发布的方式。将回调附加到发布
我发布了一些委托任务,当委托任务完成时,我想进行一些UI更改。
让我知道如果你知道如何或如果你知道这是不可能的。
编辑: 我想我还可以做什么,我想,如果我能返回一个值给出版商事后公布结束。
我想知道是否有人知道在发布的事件完成时将事件/回调附加到dojo发布的方式。将回调附加到发布
我发布了一些委托任务,当委托任务完成时,我想进行一些UI更改。
让我知道如果你知道如何或如果你知道这是不可能的。
编辑: 我想我还可以做什么,我想,如果我能返回一个值给出版商事后公布结束。
我不知道的“正确”的方式做到这一点,但你可以尝试使用一个单独的通道和执行“按照惯例”的连接:
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]);
});
}
我也可以访问我发布的功能,但我认为它可能会变得杂乱,所以我想我会尽量避免它。 – hbhakhra
让我们尝试对@塞巴斯蒂安的前提是这样的
// 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"
});
});
这看起来可能会起作用。当我有机会时,我会尝试一下 – hbhakhra
大厦:
//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是更好的语法糖。
对于那些提出延期解决方案的人,我有一个问题。如果我正在修改订阅者的代码,那么当订阅者完成时发布事件不是更好,因为这个事件对任何可能需要它的人都是可用的吗? – hbhakhra
我认为这一切都取决于用户完成消费发布的消息时需要知道什么。如果只有一件事(最初的发布者)需要做某件事,那么也许使用“延迟”将是最有意义的。如果多个不相交的实体需要在用户完成消费时执行一些工作,则发布到另一个主题可能是最有意义的。 – BuffaloBuffalo
谢谢大家的答案。虽然延期的答案很好,可能是更好的练习,但对于我的使用,由于没有真正的方法来附加回调,我只是要发布回调请求。 – hbhakhra