J'ai donc quelques fonctions async/wait et j'aimerais les mettre en file d'attente. Ils sont tirés "au hasard" sur des événements Websocket spécifiques, mais ils doivent s'exécuter l'un après l'autre. Je teste donc avec ce code.
const aida = {
async launch() {
await someFunction();
},
async login() {
await Auth();
await UserSettings();
},
async goToMonth() {
await JumpToDefaultMonth();
}
};
const q = async.queue(function(task, callback) {
console.log('hello ' + task.name);
callback();
}, 1);
q.drain = function() {
console.log('all items have been processed');
};
q.push(aida.launch());
q.push(aida.login());
q.push(aida.goToMonth());
Je m'attendrais à ce que, par exemple, login()
ne s'exécute qu'après launch()
terminé.
Est-ce que je fais quelque chose de mal ou cette bibliothèque n'est-elle pas la bonne pour moi ?
Salut @codeofsumit , merci pour la question !
En regardant votre code, je pense que le problème vient des trois dernières lignes. Vous appelez les fonctions et poussez leur valeur de retour dans le queue
au lieu de pousser les fonctions dans le queue
. Consultez la documentation sur QueueObject
pour plus d'informations sur q.push
. Essayez de les changer en :
q.push(aida.launch);
q.push(aida.login);
q.push(aida.goToMonth);
Étant donné que vous avez un concurrency
de 1
, la file d'attente ne traitera login
qu'après la fin de launch
.
@hargasinski Je l'ai pensé et j'ai essayé cela, mais cela soulève deux nouvelles questions :
@codeofsumit désolé, j'ai réalisé que mon commentaire précédent était un peu erroné, j'ai confondu queue
avec une fonction différente. J'espère pouvoir clarifier.
- Comment démarre la file d'attente ? N'a pas semblé démarrer après la première poussée
queue
devrait commencer lorsqu'il obtient un task
, c'est-à-dire lorsque vous appelez q.push
. Pourriez-vous fournir un exemple de code ? Le code ci-dessus a fonctionné pour moi.
Remarque : si vous utilisez des fonctions es7 async
avec async
et transpilez votre code, vous devrez les envelopper dans async.asyncify
. Voir ce commentaire pour plus d'informations.
- Comment passer des paramètres aux fonctions ?
C'est là que je me suis trompé. Le worker
vous transmettez à async.queue
lorsque vous le créez, est responsable du traitement de la tâche. Si vous devez exécuter launch
, login
, et goToMonth
pour chaque événement de la websocket, vous pouvez simplement insérer la fonction worker
. Par exemple,
const q = async.queue(function(task, callback) {
async.series([
async function() {
await aida.launch(task.foo, task.boo);
},
async function() {
await aida.login(task.baz);
},
// etc...
], callback);
}, 1);
// on a websocket event
q.push({foo: websocketData.foo, bar: websocketData.bar, baz: websocketData.baz});
Sinon, si vous avez besoin de mettre en file d'attente des fonctions, c'est un peu bidon, mais vous pourriez quelque chose du genre :
const q = async.queue(async function(task) {
await task.func.apply(null, task.args);
}, 1);
// on a websocket event
q.push({func: aida.launch, args: [websocketData.foo, websocketData.bar]});
q.push({func: aida.login, args: [websocketData.baz]});
q.push({func: aida.goToMonth, args: []});
Espérons que ce soit un peu plus clair.
euh ça a l'air très prometteur. Merci d'avoir pris le temps de l'expliquer avec autant de détails. Aide beaucoup !
Aussi: j'ai remarqué que vous résolvez les problèmes de ce référentiel TRÈS rapidement (pas beaucoup de problèmes ouverts pour une bibliothèque aussi populaire). très impressionnant - continuez votre bon travail !
Commentaire le plus utile
@codeofsumit désolé, j'ai réalisé que mon commentaire précédent était un peu erroné, j'ai confondu
queue
avec une fonction différente. J'espère pouvoir clarifier.queue
devrait commencer lorsqu'il obtient untask
, c'est-à-dire lorsque vous appelezq.push
. Pourriez-vous fournir un exemple de code ? Le code ci-dessus a fonctionné pour moi.Remarque : si vous utilisez des fonctions es7
async
avecasync
et transpilez votre code, vous devrez les envelopper dansasync.asyncify
. Voir ce commentaire pour plus d'informations.C'est là que je me suis trompé. Le
worker
vous transmettez àasync.queue
lorsque vous le créez, est responsable du traitement de la tâche. Si vous devez exécuterlaunch
,login
, etgoToMonth
pour chaque événement de la websocket, vous pouvez simplement insérer la fonctionworker
. Par exemple,Sinon, si vous avez besoin de mettre en file d'attente des fonctions, c'est un peu bidon, mais vous pourriez quelque chose du genre :
Espérons que ce soit un peu plus clair.