2017-02-03 3 views
1

I ein 2D-Array (2 · n) von Versprechen und ich möchte zunächst alle Versprechen in Zeile 1 zu verarbeiten, und dann alle Zusagen in Zeile 2Knoten: Prozess ein 2D-Array von Versprechen

Anders Worte, ich möchte eine Gruppe von Versprechen verketten, nachdem eine andere Gruppe von Versprechungen ihre Ausführung abgeschlossen hat.

Wie kann ich das erreichen?

Ich habe Folgendes versucht, aber es funktioniert nicht. Irgendwelche Ideen?

Promise.resolve() 
    .then(createPromises)//generates topPromises= [ [p1, p2, p3], [p4,p5,p6]] 
    .then(function(topPromises){ 
     Promise.all(topPromises[0]) 
     .then(Promise.all[topPromises[1]) 
    }) 
+0

Was ist die endgültige Datenstruktur oder Ausgabe, nach der Sie suchen? – naomik

+0

Die endgültige Datenstruktur hängt von der Reihenfolge der Ausführung ab. ZB Hinzufügen von Daten in einem DB, wo Stores (Versprechen p1 - p3) vor Items hinzugefügt werden sollten (verspricht p4 - p6). – STiGMa

Antwort

1

Sie können dies mit ein wenig Pseudo-Rekursion abziehen.

Im Wesentlichen haben Sie eine Funktion, die eine Gruppe von Versprechen abschließt. Sobald es abgeschlossen ist, rufen Sie dieselbe Funktion erneut auf, aber mit der nächsten Gruppe.

let promiseCount = 1; 
 
function create() { 
 
    let n = promiseCount++; 
 
    return new Promise((resolve, reject) => { 
 
    setTimeout(() => { 
 
     console.log(n); 
 
     resolve(); 
 
    }, 500 * n); 
 
    }); 
 
} 
 

 
let groups = [ 
 
    [create(), create(), create()], 
 
    [create(), create(), create()], 
 
    [create(), create(), create()] 
 
]; 
 

 
(function runGroup(i) { 
 
    if (i < groups.length) { 
 
    Promise.all(groups[i]) 
 
     .then(() => { 
 
     console.log('Group', i + 1, 'complete'); 
 
     runGroup(i + 1); 
 
     }); 
 
    } 
 
})(0);

+0

Danke, das ist mehr oder weniger das, was ich erreichen möchte. Würde das funktionieren, wenn andere Versprechungen innerhalb der create-Funktion aufgerufen würden? – STiGMa

+0

@STiGMa Sicher, keine Probleme dort. –

+1

danke für die Hilfe. Ich habe das Problem anhand Ihres Beispiels gelöst. – STiGMa

2

Sie verfehlten return, und übergeben Sie einen Promise statt function in einem der .then ‚s

Promise.resolve() 
.then(createPromises)//generates topPromises= [ [p1, p2, p3], [p4,p5,p6]] 
.then(function(topPromises){ 
    return Promise.all(topPromises[0]) 
    .then(() => Promise.all[topPromises[1])) 
}) 

Ich weiß nicht genau, was Sie brauchen, aber wahrscheinlich Ihr Code könnte so aussehen:

cratePromises().reduce((topPromise, nestedPromises) => { 
    return topPromise.then(data => { 
    // data is empty array on first iteration and array of nestedPromises values on next iterations 
    return Promise.all(nestedPromises) 
    }) 
}, Promise.resolve([])) 
+0

Danke, ich weiß, dass das Beispiel unvollständig ist (der Einfachheit halber). Könnten Sie bitte eine Erklärung für Ihren Code geben? Ich habe nicht viel Erfahrung mit Node. – STiGMa

+0

@STiGMa Eigentlich ist dieser Code nicht knotenspezifisch, es ist nur JavaScript. Ich benutze 'reduce' Funktion für Build-Versprechen-Kette aus verschachtelten Array von Versprechen. Es kann '.forEach' Verfahren ersetzt werden oder sogar' for' Operator wie folgt aus:. '' 'lassen topPromise = Promise.resolve() cratePromises() foreach (nestedPromises => { topPromise = topPromise .dann (data => { return Promise.all (nestedPromises) }) }) '' ' Sorry, es war (und wahrscheinlich noch existiert) einige dumme Fehler in meinem Code-Beispiele wie verpasst'() ' nach 'createPromises' – Daniel

Verwandte Themen