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?
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:
@codeofsumit Entschuldigung, ich habe festgestellt, dass mein vorheriger Kommentar ein kleiner queue
mit einer anderen Funktion verwechselt. Hoffentlich kann ich das klären.
- 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 .
- 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!
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.queue
sollte starten, wenn es eintask
bekommt, dh wenn Sieq.push
aufrufen. Könnten Sie ein Codebeispiel bereitstellen? Bei mir lief der obige Code.Randnotiz: Wenn Sie es7
async
Funktionen mitasync
und Ihren Code transpilieren, müssen Sie sie inasync.asyncify
umschließen. Weitere Informationen finden Sie in diesem Kommentar .Hier wurde ich verwirrt. Das
worker
Sie beim Erstellen anasync.queue
, ist für die Verarbeitung der Aufgabe verantwortlich. Wenn Sielaunch
,login
undgoToMonth
für jedes Ereignis aus dem Websocket ausführen müssen, können Sie einfach die Funktionworker
eingeben. Zum Beispiel,Andernfalls, wenn Sie Funktionen in die Warteschlange stellen müssen, ist dies ein wenig hackig, aber Sie könnten etwas in der Art tun:
Hoffentlich ist das etwas klarer.