par
Berzemus » 06 févr. 2008, 18:01
C'est rare que je reprends d'anciennes fonctions (parce que le temps que je veux les réutiliser, j'ai changé mes habitudes

), mais j'ai pondu ceci y'a pas longtemps, et je me dis que c'est quand même pratique (même si, peut-être, c'est à nouveau par manque de connaissance de ce qu'il y a d'autre).
Alors, Il s'agit d'un simple objet, qui sert de file d'attente en attendant un certain évènement (pratique pour une application Über-JS).
D'abord, on l'initialise avec un identifiant (du coup, il peut y en avoir plusieurs):
Alors, tout ce qu'on veut avoir exécuté une fois l'évènement achevé s'ajoute en toute simplicité:
Code : Tout sélectionner
wait.dothis("coco",function() {
alert("weee, coco est arrivé!");
});
La fonction s'ajoute sur le tas, et on peut en ajouter plein, un peu partout dans le script.
Et pour montrer qu'on est prêts..
Et si jamais on ajoute des fonctions à l'identifiant une fois celui-ci prêt, la fonction s'exécute tout de suite. (même chôse si l'identifiant n'existe pas)
Certes, c'est très proche d'un callback. Mais les callback, c'est pas pratique, ça se définit à un endroit, et du coup on y perd quand même en clarté. Je l'utilise aussi bien pour tout ce qui est ajax, que pour ce qui est animation. (genre navigation avec fondu, pour empêcher le nouveau contenu d'apparaître avant que le prochain ne soit complètement disparu, tout en autorisant le traitement du contenu arrivant.. bon, c'est pas clair, mais c'est cool). Comme ça, je mets juste l'appel wait.ready() dans le callback, et je continue tout naturellement le flux de l'appli, sans trop me préoccuper, et sans surcharger le client avec des ontimeout() intempestifs.
Ah oui, le code:
Code : Tout sélectionner
wait={
counters:[],
wait:function(cnt) {
this.counters[cnt] = {
// status: 1= occupied, 2= doing stuff, 3= free, 4=dying
tasks:[],
status:1,
done:function() {
this.status=2;
this.work();
this.status = 3;
},
job:function (fn) {
this.tasks.push(fn);
if (this.status === 3) {
this.work();
} else {
}
},
work:function() {
if (this.status > 1 && this.tasks[0] !== undefined) {
while (work = this.tasks.shift()) {
work();
}
}
}
};
},
ready:function(cnt) {
this.counters[cnt].done();
},
dothis:function(cnt,fn) {
if (this.counters[cnt] !== undefined) {
this.counters[cnt].job(fn);
} else {
fn();
}
}
};
C'est pas encore très mature, mais pour le moment ça marche plutôt bien

C'est rare que je reprends d'anciennes fonctions (parce que le temps que je veux les réutiliser, j'ai changé mes habitudes :wink: ), mais j'ai pondu ceci y'a pas longtemps, et je me dis que c'est quand même pratique (même si, peut-être, c'est à nouveau par manque de connaissance de ce qu'il y a d'autre).
Alors, Il s'agit d'un simple objet, qui sert de file d'attente en attendant un certain évènement (pratique pour une application Über-JS).
D'abord, on l'initialise avec un identifiant (du coup, il peut y en avoir plusieurs):
[code]wait.wait("coco");[/code]
Alors, tout ce qu'on veut avoir exécuté une fois l'évènement achevé s'ajoute en toute simplicité:
[code]wait.dothis("coco",function() {
alert("weee, coco est arrivé!");
});
[/code]
La fonction s'ajoute sur le tas, et on peut en ajouter plein, un peu partout dans le script.
Et pour montrer qu'on est prêts..
[code]wait.ready("coco");[/code]
Et si jamais on ajoute des fonctions à l'identifiant une fois celui-ci prêt, la fonction s'exécute tout de suite. (même chôse si l'identifiant n'existe pas)
Certes, c'est très proche d'un callback. Mais les callback, c'est pas pratique, ça se définit à un endroit, et du coup on y perd quand même en clarté. Je l'utilise aussi bien pour tout ce qui est ajax, que pour ce qui est animation. (genre navigation avec fondu, pour empêcher le nouveau contenu d'apparaître avant que le prochain ne soit complètement disparu, tout en autorisant le traitement du contenu arrivant.. bon, c'est pas clair, mais c'est cool). Comme ça, je mets juste l'appel wait.ready() dans le callback, et je continue tout naturellement le flux de l'appli, sans trop me préoccuper, et sans surcharger le client avec des ontimeout() intempestifs.
Ah oui, le code:
[code]wait={
counters:[],
wait:function(cnt) {
this.counters[cnt] = {
// status: 1= occupied, 2= doing stuff, 3= free, 4=dying
tasks:[],
status:1,
done:function() {
this.status=2;
this.work();
this.status = 3;
},
job:function (fn) {
this.tasks.push(fn);
if (this.status === 3) {
this.work();
} else {
}
},
work:function() {
if (this.status > 1 && this.tasks[0] !== undefined) {
while (work = this.tasks.shift()) {
work();
}
}
}
};
},
ready:function(cnt) {
this.counters[cnt].done();
},
dothis:function(cnt,fn) {
if (this.counters[cnt] !== undefined) {
this.counters[cnt].job(fn);
} else {
fn();
}
}
};[/code]
C'est pas encore très mature, mais pour le moment ça marche plutôt bien :roll: