2017-07-13 4 views
0

Ich habe eine Reihe von Versprechen, und ich möchte bestimmte Aktionen an ihnen auslösen, sobald sie abgeschlossen sind. Promises.all ist nicht ganz das, was ich suche, seit es wartet, bis alle Promises in der Iterable abgeschlossen sind. Promises.race gibt das erste Versprechen zurück, das vollständig ist.Array of Promises lösen Versprechen sobald fertig?

Angenommen, Sie verwenden können: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

+4

'promises.forEach (p => p.then (doStuff))' – 4castle

+2

können Sie ein Codebeispiel posten? Je nachdem, wie Sie Ihre Versprechen erstellen, können Sie '.then()' im Allgemeinen innerhalb der einzelnen Versprechen verwenden und das Array mit 'Promise.all' auflösen. –

+1

@ 4castle Vergiss nicht '.catch()' Fehler, wenn du das tust. Oder besser, ** verwende nicht 'forEach' **, sondern' map' und tu etwas mit dem Ergebnis (inklusive Fehlerbehandlung) – Bergi

Antwort

2

Unter Berücksichtigung Sie Vanilla JS verwenden möchten, wenn Sie sie wollen, dass sie gleichzeitig auszuführen, und sobald sie Sie sind entschlossen, könnten so etwas tun:

// create a Promise that is resolved after passed millisecs with millisecs * 2 as value 
const createP = (ms) => new Promise(resolve => setTimeout(() => resolve(ms * 2), ms)); 

// your array of Promises 
const pArray = [createP(1000), createP(200), createP(500)]; 

// map() and Promise.all() is necessary in order to wait until all the promises are executed 
Promise.all(pArray.map(promise => { 
    // log each result 
    return promise.then(console.log); 
})) 
.catch(err =>{ 
    // do some error handling here if necessary 
}); 

// it should log 400, 1000, 2000 in this order 
0

Sie können eine Methode promiseSerial erstellen, die Versprechen der Reihe statt parallel lösen wird.

Hier ist ein Beispiel-Implementierung:

/* 
* promiseSerial resolves Promises sequentially. 
* @example 
* const urls = ['/url1', '/url2', '/url3'] 
* const funcs = urls.map(url =>() => $.ajax(url)) 
* 
* promiseSerial(funcs) 
* .then(console.log) 
* .catch(console.error) 
*/ 
const promiseSerial = funcs => 
    funcs.reduce((promise, func) => 
    promise.then(result => func().then(Array.prototype.concat.bind(result))), 
    Promise.resolve([])) 

// some url's to resolve 
const urls = ['/url1', '/url2', '/url3'] 

// convert each url to a function that returns a promise 
const funcs = urls.map(url =>() => $.ajax(url)) 

// execute Promises in serial 
promiseSerial(funcs) 
    .then(console.log) 
    .catch(console.error) 

aus: https://hackernoon.com/functional-javascript-resolving-promises-sequentially-7aac18c4431e

+0

Dies ist seriell, er fragt nach einer gleichzeitigen Lösung, denke ich . –

Verwandte Themen