我想知道是否有人知道在发布的事件完成后将事件/回调附加到dojo发布的方法。
我将某些内容发布为委派任务,当委派任务完成时,我想进行一些UI更改。
如果您知道如何知道这是不可能的,请告诉我。
编辑: 如果我能够在发布的事件结束后向发布者返回一个值,我想我也可以做我想做的事。
答案 0 :(得分: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"
});
});
答案 1 :(得分: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]);
});
}
答案 2 :(得分: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是更好的语法糖。