Venendo dal mondo Java, ho problemi a tradurre un approccio multi-thread in IO al concetto di Promesse ES6 di IO aysnc. Molti degli esempi che ho visto sulle promesse mostrano un flusso lineare.
promiseFunction
.then(functionThatReturnsAnotherPromise)
.then(functionThatReturnsYetAnotherPromise)
...
Gli esempi che mostrano un flusso non lineare mostrano funzioni in cui devo avere tutte le promesse complete prima di passare:
Promise.all([functionThatReturnsOnePromise, functionThatReturnsAnotherPromise])
.then(functionThatUsesBothReturnValues);
Quello che sto cercando di fare è un flusso di controllo ad albero in cui ogni ramo non ha dipendenza da un altro ramo. Considera questo grafico che mostra il mio flusso di controllo:
- (1) Crea una richiesta REST asincrona per ottenere i progetti
- (2) 5 progetti ricevuti. Per ogni progetto ricevuto, (a) creare un'istanza di progetto e (b) effettuare una richiesta REST asincrona per ottenere i team di quel progetto
- (3-7) x Teams ricevuti. Per ogni squadra ricevuta, (a) creare un'istanza di gruppo, (b) aggiungere la squadra come membro alla sua istanza di progetto padre e (c) effettuare una chiamata REST per ottenere tutti i membri della squadra di quel gruppo
- (8-21) x membri del team ricevuti. Per ogni membro del team, (a) creare un'istanza del membro del team e (b) aggiungerlo come membro all'istanza del team principale.
Ciò che è importante notare qui è che per far accadere 8-21, 3-7 non tutti devono essere eseguiti. Fondamentalmente, quello che sto cercando di ottenere qui è che una volta ricevuta la risposta di 2, fai 3, 4, 5, 6 e 7. Non appena 3 è finito (non ti preoccupi di 4-7), fai 8-10.
Tuttavia, non sono sicuro di quali costrutti Promise realizzino questo flusso di controllo ad albero, poiché 8-21 non è tutto dipendente dal completamento di 3-7.
getAllProjects()
.then(function(responseJson) {
var promises = [];
for (var index in responseJson.value) {
var project = new Project(responseJson.value[index]);
promises.push(getTeamsForProject(project));
}
return promises;
})
.thenAsEachPromiseCompletes(function(responseJson) {
var promises = [];
for (var index in responseJson.value) {
var team = new Team(responseJson.value[index]);
promises.push(getTeamMembersForTeam(team));
}
return promises;
})
.thenAsEachPromiseCompletes(function(responseJson) {
...
});