2016-11-22 7 views
0

I promises bin mit Liste der Aufgabe zu bewältigen:Javascript - Wie man mit Loops richtig reagiert?

Dies ist ein Beispiel von Code:

var array = ["aaa", "bbbb", "cccc", "dddd", "eeee"]; 
var result = []; 
var p = Promise.resolve({ 
    then: function(onFulfill, onReject) { 
    array.forEach(function(x){ 
    // http request with x and make sure this request ends before a new one if fired 
    // put http resolte in array : result.push(httpRespose); 
    }); 
    //when done, onFulfill(result) 
} 
}); 
p.then(
function(v) { 
    console.log(v); // "fulfilled!" 
    }, function(e) { 
     console.log(e); // not called 
}); 

Ich möchte jedes Element von Array in der Lage sein zu machen und HTTP-Anforderung verwenden, dann setzen Ergebnis in ein anderes Array und wenn Sie fertig sind, geben Sie das neue Array zurück. Ich möchte auch wissen, ob es möglich ist sicherzustellen, dass http-Ergebnisse in der gleichen Reihenfolge hinzugefügt werden (es ist nicht sehr wichtig).

Kann mir bitte jemand helfen?

+0

eine Reihe von Versprechen erstellen und lösen sie mit 'Promise.all': https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Referenz/Globale_Objekte/Versprechen/alle. –

+0

Sie könnten alle Versprechen in einem Array aggregieren und [Promise.all] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) verwenden, um das Ereignis auszulösen Sie haben alle abgeschlossen. –

+0

'// http Anfrage mit x und stellen Sie sicher, dass diese Anfrage endet vor einer neuen, wenn gefeuert wird, wenn das der Fall ist, wollen Sie nicht versprechen.all –

Antwort

1

Promise.all wird verwendet, um auf eine Reihe von Versprechen zu warten.

Jedes Mal, wenn Sie ein Versprechen erstellen, es in ein Array schieben und dann verwenden

Promise.all(myPromiseArray).then(allDoneHandler)

Hier ein Beispiel:

var items = [ 500, 1000, 1500 ]; 
 
var results = []; 
 
items.forEach((item) => { 
 
    let promise = new Promise((resolve) => { 
 
    setTimeout(() => { 
 
     console.log(item); 
 
     resolve(item); 
 
    }, item); 
 
    }); 
 
    results.push(promise); 
 
}); 
 
Promise.all(results).then(() => { 
 
    console.log('done!'); 
 
}); 
 
     

+0

Nit: 'var results = items.map (item => neues Versprechen (...));' –

+0

@FelixKling Thanks. Das würde in meinem Beispiel funktionieren, aber aus Gründen der Einfachheit wollte ich nicht zu viel * komprimieren. – xdumaine

+0

Einzeiler: Promise.all (items.map (makeAjaxRequest)))) dann (console.log) – tjoskar

1

Um "run Versprechen" In der Reihenfolge (besonders von einem Array) können Sie dieses Muster verwenden:

var donePromise = arrayOfData.reduce(function(sequence, value, index){ 
    return sequence.then(function(){ 
     //doSomethingWithValueAndReturnAPromise 
    }) 
}, Promise.resolve()); 

aber da Sie wollen die Ergebnisse gesammelt und nicht nur ein Indikator, wenn die Arbeit erledigt ist, müssen wir das modufy:

Wir Array.map() und Promise.all() unter Verwendung der Ergebnisse zu sammeln, und eine ähnliche Ansatz wie oben die sequentielle Ausführung zu gewährleisten:

var urls = [/*...*/]; 

var _sequence = Promise.resolve(); 
Promise.all(urls.map(function(url) { 
    return _sequence = _sequence.then(function(){ 
     //fetch the url and return a Promise: 
     //return fetch(url).then(response => response.text()) 
    }); 
})).then(function(results){ 
    //console.log(results) 
});