2016-06-03 16 views
1

diese Funktion betrachten, die eine Datenbank spottet Abfragen und einige Datensätze nach 2 Sekunden, über ein Versprechen der Rückkehr:Warum wartet Node auf ein einzelnes Versprechen, aber nicht auf eine Reihe von Versprechen?

function query() { 
    var recs = [1,2,3]; 
    return new Promise(r => setTimeout(() => r(recs), 2000)) 
} 

Wenn ich die folgende Anweisung hinzu:

query().then(console.log); 

und führen Sie das das Skript mit Knoten, pausiert 2 Sekunden, druckt die Datensätze aus und kehrt wie erwartet zurück.

Auf der anderen Seite, wenn ich mit einer Reihe von exakt den gleichen Versprechungen, die Zeile:

Array(5).map(x => query().then(console.log)); 

Das Skript sofort zurück, und nichts druckt. Warum wartet Node darauf, dass das einzelne Versprechen vor dem Beenden zurückgegeben wird, aber sofort beendet wird, wenn ein Array von 5 nicht aufgelösten Versprechen vorhanden ist?

+1

Wenn Sie ein gelöstes Versprechen warten möchten, um einen anderen auszuführen, würde dieser Beitrag Sie mögen: http://stackoverflow.com/questions/37578795/implementing-promise-series-alternative-to-promise-all –

Antwort

1

Es ist, weil Array(5).map(... nie die Funktion aufgerufen wird, um Karte zuzuordnen. Der Grund ist, dass die Karte Löcher im Array überspringt. Array(5) gibt ein so genanntes Sparse-Array zurück und hat nur leere Slots, aber keinen eigentlichen Inhalt.

Für weitere Informationen über Sparse-Arrays und wie man sie in dichte Arrays verwandeln kann, würde ich this excellent blog Beitrag von Axel Rauschmayer empfehlen.

+0

Ich habe nur vergessen, 'fill' zu nennen. ty. – Jonah

+1

Sie können Array.from ({length: 5}, mapFunction); –

+1

@JoseHermosillaRodrigo, sehr nett, wusste nicht darüber. – Jonah

Verwandte Themen