2017-03-11 3 views
0

Ich bin immer noch ziemlich neu und vielleicht promise.all() ist nicht das, was ich brauche, oder vielleicht mache ich nur den falschen Weg zu beginnen, aber ich habe eine Reihe von Ressourcen, die ich über HTTP abrufen will.Wie löst man eine Promise.all() trotz einiger Ablehnungen?

Einige von ihnen werden für bestimmte Account-Typen nicht verfügbar sein, daher denke ich, dass diejenigen, die aufgrund von serverseitigen Berechtigungen fehlschlagen, scheitern und einfach weitermachen. So

promise.all([ 
    http.get('bookings'), 
    http.get('users'), 
    http.get('listings') 
]) 
.then(valuse => assign(values)) 
.catch(err => makeAnError(err)) 

vorausgesetzt http.get('users') ausfällt, wird die promise.all ablehnen und keiner der anderen Werte werden als die Entschlossenheit Funktion zugewiesen werden diese Werte zuweisen nie ausgeführt wird.

Welche Lösungsvorschläge gibt es?

+0

einfache Antwort, individuelle Ablehnungen Griff –

+0

Die 'async' Paket für Knoten hat einige gute Kontrollfluss-Funktionen, die nützlich sein können insbesondere die Funktion 'async.series'. –

+0

@m_callens - 'asyncjs + Promises == schlechtes Design' (Ich beziehe mich nicht auf async/warte) - außerdem führt' async.series' die Aktionen in Serie durch, während der Code in der Frage sie parallel ausführt (wie so viel wie das in js möglich ist) –

Antwort

0

ich tun es auf diese Weise

Promise.prototype.always = function always() { 
    return this.then(result=>({fulfilled: true, result}), reason=>({fulfilled: false, reason})); 
}; 

dann Ihren Code

promise.all([ 
    http.get('bookings').always(), 
    http.get('users').always(), 
    http.get('listings').always() 
]) 
.then(values => assign(values)) // assign needs to check each value.fulfilled == true before using value.result 
.catch(err => makeAnError(err))