Gegeben ein Array mit Verweisen auf asynchrone Funktionen (die Versprechungen oder einfache Werte zurückgeben), ich möchte nacheinander durchlaufen es jedes Element, bis at mindestens eines der Elemente wird in den Truthy-Wert aufgelöst.Sequenziell iterieren Liste von asynchronen Funktionen, bis mindestens eine truthy Wert in Node.js zurückgibt
Die Idee kam von diesem einfachen Synchroncode:
var hasAccess = (user.isAdmin() || user.isManager() || entity.isOwnedBy(user));
Der obigen Code gut für synchrone Funktionen arbeitet, wird aber für die asynchron diejenigen brechen. Ich suche nach einem asynchronen Ersatz des obigen Codes.
Ich erwarte, dass es so genannt werden (in ES6 Syntax der Kürze halber):
atLeastOneTruthy([
() => user.isAdmin(), // Called first
() => user.isManager(), // Called second if first returned falsy value
() => entity.isOwnedBy(user) // Called third if all previous returned falsy values
]).then(function (result) {
// result === (true || false)
}).catch(function() {
// Promise chain is rejected when at least one element in rejected
});
alle Funktionen im Beispiel oben Rückkehr entweder Versprechungen oder einfache Werte direkt.
Gibt es eine Out-of-the-Box-Lösung dafür? Ich verwende Bluebird-Versprechen, jedoch konnte ich nichts passendes in seiner API finden. Ich kann z.B. Promise.any()
, weil es nur nach gelösten Versprechen sucht und die zurückgegebenen Werte nicht überprüft. Ich kann Promise.map()
entweder nicht verwenden, weil es alle Funktionen ausführt, aber ich möchte, dass sie nur bei Bedarf ausgeführt werden (d. H. Wenn vorheriges Element fehlgeschlagen ist).
Eine Node-Modul-Empfehlung wäre großartig (ich konnte keine finden), aber ein Konzept, wie atLeastOneTruthy()
codiert werden könnte, wäre auch schön, weil ich einige Zweifel über seine Umsetzung habe.
@zerkms Der Funktionsausdruck 'innerHandler' verläuft, sich in eine' then' Ausdruck. Dies ist nicht rekursiv in dem Sinne, dass die Funktion mehrere Male auf dem Stapel erscheint, aber in dem Sinne rekursiv ist, dass ihre Ausführung selbstreferentiell ist. –
Oh, tatsächlich habe ich das übersehen. – zerkms
Eine sehr elegante Lösung! Ich habe gerade meine "rekursive" Implementierung abgeschlossen, aber ich mag Ihre Lösung besser. Danke, dass du dir Zeit genommen hast! ;) –