2016-04-09 18 views
2

Ich habe ein multidimensionales Array von Versprechen, die ich versuche zu lösen. Wenn ich das Ergebnis console.log anmelde, kann ich die Arrays sehen und in jedem ist das Versprechen zusammen mit einem [[PromiseStatus]] und einem [[PromiseValue]]. Wie bekomme ich den Versprechenswert?Erhalten der Ergebnisse eines Versprechens in einem multidimensionalen Array

Hier ist ein Code-Snippet:

(resourcePromises ist nur ein mehrdimensionales Array von Versprechen).

Promise.all(resourcePromises).then(function(values) 
    { 
     console.log(values); 
    }); 

Und dann werden die Werte der Variablen mehrere Arrays halten, und innerhalb jeder dieser Anordnungen ist eine Liste von Versprechungen, die ich versuche, aus den Werten zu greifen.

+0

Was sollte die erwartete Ausgabe in Werten sein? Sollte es auch ein mehrdimensionales Array mit aufgelösten Versprechenswerten sein? – Matthijs

+0

Mögliches Duplikat von [How do do versprechen.all für Array von Array von Versprechen?] (Http://stackoverflow.com/questions/36094865/how-to-do-promise-all-for-array-of-array- (Versprechen) – sheilak

Antwort

3

Klingt wie Sie müssen Promise.all auf der tiefsten Ebene, dann die nächste tiefste, und so weiter, bis Sie die Spitze erreichen. Für 2D-Arrays, dass würde sein:

function deepAll(array) { 
    if (array instanceof Promise) 
     // Just in case... 
     return array; 
    else if (array.length == 0) 
     // The 'real' function will fail with an empty array and it's the same in both cases anyhow. 
     return []; 
    else if (Array.isArray(array[0])) 
     // There's another array level, so turn it into an array of promises. 
     return array.map(deepAll); 
    else 
     // This is an array of promises, and we already have a function for that case. 
     return Promise.all(array); 
} 

deepAll(promises).then(function(values) { 
    console.log(values); 
}); 
+1

Ich würde 'array.length === 0' verwenden, um zu vermeiden, dass auf 'undefined' getriggert wird, oder den Typ überprüfen, bevor man' length' betrachtet, sonst kann dieses 'if' auf einfache Werte triggern. Außerdem würde ich [nach einer '.then'-Methode suchen] (http://stackoverflow.com/q/27746304/918910) anstatt" instanceof "zu verwenden, was unzuverlässig ist. – jib

1

Promise.all nimmt iterable als:

Promise.all(promises.map(Promise.all)).then(function(values) { 
    console.log(values); 
}); 

Wenn Sie auf beliebige Tiefe gehen wollen, dann würden Sie zwischen map und all für jede Ebene wählen müssen es ist Argument. Sie müssen also nur einen Iterator schreiben, der Ihr multidimensionales Array wirft.

function *deepWalk(arr) { 
    for (var item of arr) {  
    if (Array.isArray(item)) 
     yield* deepWalk(item) 
    else 
     yield item; 
    } 
} 

Promise.all(deepWalk(resourcePromises)).then(... 
Verwandte Themen