Async: Comment mettre en file d'attente les fonctions asynchrones es6

Créé le 12 mai 2017  ·  4Commentaires  ·  Source: caolan/async

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 ?

question queue

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.

  1. 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.

  1. 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.

Tous les 4 commentaires

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 :

  1. Comment démarre la file d'attente ? N'a pas semblé démarrer après la première poussée
  2. Comment passer des paramètres aux fonctions ?

@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.

  1. 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.

  1. 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 !

Cette page vous a été utile?
0 / 5 - 0 notes