2017-02-21 2 views
1

Warum protokolliert der folgende Code ein Array mit ausstehenden Versprechungen? Ich erwarte, dass alle Versprechen im Array gelöst werden, und führe dann die Funktionen in den .then-Methoden aus..hen Führt auf "ausstehend" statt auf gelöstes Versprechen aus

for (let i = 0; i < limit; i++) { 
    promiseArray.push(fetch(someUrls[i])) 
} 

Promise.all(promiseArray) 
    .then(responses => responses.map(response => response.text())) 
    .then(result => console.log(result)) 

Vielen Dank im Voraus

Antwort

6

das, weil response.text() method returns a promise ist. fetch ist eine 2-Versprechen-Sache. Einer ist für die tatsächliche Anfrage und der andere für die Konvertierung.

Was Sie tun könnten, ist die array.map Operation in eine andere Promise.all zu wickeln.

Promise.all(promiseArray) 
    .then(responses => Promise.all(responses.map(response => response.text()))) 
    .then(result => console.log(result)) 
2

Sie müssen dann auch in einem Promise.all gekettet setzen, da die response.text() auch ein anderes Versprechen zurückgibt.

for (let i = 0; i < limit; i++) { 
    promiseArray.push(fetch(someUrls[i])) 
} 

Promise.all(promiseArray) 
    .then(responses => Promise.all(responses.map(response => response.text()))) //Needs to wait for all text() promise methods to resolve 
    .then(result => console.log(result)) 

oder Sie können Kette Versprechen in Ihrer for-Schleife:

for (let i = 0; i < limit; i++) { 
    promiseArray.push(fetch(someUrls[i]).then(res => res.text())); 
} 

Promise.all(promiseArray).then(result => console.log(result)) 
Verwandte Themen