Async: Wie man es6 async-Funktionen in die Warteschlange stellt

Erstellt am 12. Mai 2017  ·  4Kommentare  ·  Quelle: caolan/async

Ich habe also ein paar asynchrone / wartende Funktionen und möchte sie in die Warteschlange stellen. Sie werden "zufällig" bei bestimmten Websocket-Ereignissen ausgelöst, müssen aber nacheinander ausgeführt werden. Also teste ich das mit diesem 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());

Ich würde erwarten, dass zum Beispiel login() erst ausgeführt wird, nachdem launch() fertig ist.
Mache ich etwas falsch oder ist diese Bibliothek nicht die richtige für mich?

question queue

Hilfreichster Kommentar

@codeofsumit Entschuldigung, ich habe festgestellt, dass mein vorheriger Kommentar ein kleiner queue mit einer anderen Funktion verwechselt. Hoffentlich kann ich das klären.

  1. Wie beginnt die Warteschlange? Scheint nach dem ersten Push nicht zu starten

queue sollte starten, wenn es ein task bekommt, dh wenn Sie q.push aufrufen. Könnten Sie ein Codebeispiel bereitstellen? Bei mir lief der obige Code.

Randnotiz: Wenn Sie es7 async Funktionen mit async und Ihren Code transpilieren, müssen Sie sie in async.asyncify umschließen. Weitere Informationen finden Sie in diesem Kommentar .

  1. Wie kann ich Parameter an die Funktionen übergeben?

Hier wurde ich verwirrt. Das worker Sie beim Erstellen an async.queue , ist für die Verarbeitung der Aufgabe verantwortlich. Wenn Sie launch , login und goToMonth für jedes Ereignis aus dem Websocket ausführen müssen, können Sie einfach die Funktion worker eingeben. Zum Beispiel,

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});

Andernfalls, wenn Sie Funktionen in die Warteschlange stellen müssen, ist dies ein wenig hackig, aber Sie könnten etwas in der Art tun:

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: []});

Hoffentlich ist das etwas klarer.

Alle 4 Kommentare

Hallo @codeofsumit , danke für die Frage!

Wenn ich mir deinen Code ansehe, denke ich, dass das Problem bei den letzten drei Zeilen liegt. Sie rufen die Funktionen auf und verschieben ihren Rückgabewert in queue im Gegensatz zu den Funktionen in queue . Weitere Informationen zu q.push Sie in den QueueObject Dokumenten . Versuchen Sie, sie zu ändern in:

q.push(aida.launch);
q.push(aida.login);
q.push(aida.goToMonth);

Da Sie concurrency von 1 , verarbeitet die Warteschlange login nachdem launch fertig ist.

@hargasinski Das dachte ich mir und habe das versucht, aber das bringt zwei neue Fragen mit sich:

  1. Wie beginnt die Warteschlange? Scheint nach dem ersten Push nicht zu starten
  2. Wie kann ich Parameter an die Funktionen übergeben?

@codeofsumit Entschuldigung, ich habe festgestellt, dass mein vorheriger Kommentar ein kleiner queue mit einer anderen Funktion verwechselt. Hoffentlich kann ich das klären.

  1. Wie beginnt die Warteschlange? Scheint nach dem ersten Push nicht zu starten

queue sollte starten, wenn es ein task bekommt, dh wenn Sie q.push aufrufen. Könnten Sie ein Codebeispiel bereitstellen? Bei mir lief der obige Code.

Randnotiz: Wenn Sie es7 async Funktionen mit async und Ihren Code transpilieren, müssen Sie sie in async.asyncify umschließen. Weitere Informationen finden Sie in diesem Kommentar .

  1. Wie kann ich Parameter an die Funktionen übergeben?

Hier wurde ich verwirrt. Das worker Sie beim Erstellen an async.queue , ist für die Verarbeitung der Aufgabe verantwortlich. Wenn Sie launch , login und goToMonth für jedes Ereignis aus dem Websocket ausführen müssen, können Sie einfach die Funktion worker eingeben. Zum Beispiel,

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});

Andernfalls, wenn Sie Funktionen in die Warteschlange stellen müssen, ist dies ein wenig hackig, aber Sie könnten etwas in der Art tun:

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: []});

Hoffentlich ist das etwas klarer.

äh, das sieht sehr vielversprechend aus. Vielen Dank, dass Sie sich die Zeit genommen haben, es so ausführlich zu erklären. Hilft sehr!

Außerdem: Mir ist aufgefallen, dass Sie Probleme in diesem Repo SEHR schnell lösen (nicht viele offene Probleme für eine so beliebte Bibliothek). 👍 sehr beeindruckend - macht weiter so!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kazaff picture kazaff  ·  10Kommentare

ORESoftware picture ORESoftware  ·  8Kommentare

joshuambg picture joshuambg  ·  21Kommentare

aearly picture aearly  ·  22Kommentare

hargasinski picture hargasinski  ·  21Kommentare