Je me demandais si quelqu'un connaissait un moyen d'attacher un événement / rappel à une publication dojo lorsque l'événement publié se termine.
Je publie quelque chose en tant que tâche déléguée et lorsque la tâche déléguée est terminée, je souhaite apporter des modifications à l'interface utilisateur.
Faites-moi savoir si vous savez comment ou si vous savez que ce n'est pas possible.
EDIT: Je suppose que je pourrais aussi faire ce que je voulais si je pouvais retourner une valeur à l'éditeur après la fin de l'événement publié.
3 réponses
Je ne connais pas de façon "correcte" de le faire, mais vous pouvez essayer d'utiliser un canal séparé et d'appliquer la connexion "par convention":
dojo.subscribe('fooChannel', function(){
....
dojo.publish('fooChannelComplete', [...]);
});
Une fonction d'aide pour rendre cela plus transparent:
function add_to_foo(f){
dojo.subscribe('fooChannel', function(){
var ret = f.apply(this, arguments);
dojo.publish('fooChannelComplete', [ret]);
});
}
Essayons quelque chose comme ça
// 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"
});
});
S'appuyant sur les prémisses de @ Sébastien:
//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();
});
Même principe, mais en utilisant dojo.when
quel IMO est un sucre syntaxique plus agréable.
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.