Mam strukturę podobną do tablicy, która uwidacznia metody asynchroniczne. Metoda async wywołuje zwracające struktury tablicowe, które z kolei ujawniają więcej metod asynchronicznych. Tworzę kolejny obiekt JSON do przechowywania wartości uzyskanych z tej struktury, dlatego muszę uważać na śledzenie odwołań w wywołaniach zwrotnych.
Zakodowałem rozwiązanie brutalnej siły, ale chciałbym nauczyć się bardziej idiomatycznego lub czystego rozwiązania.
- Wzór powinien być powtarzalny dla n poziomów zagnieżdżenia.
- Muszę użyć promise.all lub innej podobnej techniki, aby określić, kiedy należy rozwiązać procedurę obejmującą.
- Nie każdy element będzie koniecznie wymagał wywołania asynchronicznego. Tak więc w zagnieżdżonej obietnicy.all nie mogę po prostu przypisywać elementów do mojej tablicy JSON na podstawie indeksu. Niemniej jednak muszę użyć czegoś takiego jak obietnica.all w zagnieżdżonym forEach, aby upewnić się, że wszystkie przypisania właściwości zostały dokonane przed rozwiązaniem procedury zamykającej.
- Używam bluebird promise lib, ale nie jest to wymagane
Oto fragment kodu -
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
Promise.map
(równoległe) i Promise.each
(sekwencyjnego) W tym przypadku, również uwaga Promise.defer
jest przestarzała - kod w moich pokazów Odpowiedź Jak unikać jej przez powrocie obietnic. Obietnice dotyczą zwracanych wartości.