Ich habe ein Array, das Dateinamen bei jedem Index enthält. Ich möchte diese Dateien eins nach dem anderen (synchron) herunterladen. Ich kenne 'Async
' Modul. Aber ich möchte wissen, ob irgendwelche Funktionen in Lodash
oder Underscore
oder Bluebird
Bibliothek diese Funktionalität unterstützt.Wie man ein Array synchron mit lodash, Unterstrich oder Bluebird iteriert
Antwort
Sie Promise.mapSeries
drossel des verwenden können:
var files = [
'file1',
'file2'
];
var result = Promise.mapSeries(files, function(file) {
return downloadFile(file); // << the return must be a promise
});
Je nachdem, was Sie Datei zum Download verwenden, können Sie ein Versprechen oder nicht zu bauen.
aktualisieren 1
Ein exemple einer downloadFile()
Funktion nur NodeJS:
var http = require('http');
var path = require('path');
var fs = require('fs');
function downloadFile(file) {
console.time('downloaded in');
var name = path.basename(file);
return new Promise(function (resolve, reject) {
http.get(file, function (res) {
res.on('data', function (chunk) {
fs.appendFileSync(name, chunk);
});
res.on('end', function() {
console.timeEnd('downloaded in');
resolve(name);
});
});
});
}
aktualisieren 2
Als Gorgi Kosev vorgeschlagen, den Aufbau einer Kette von verspricht eine Schleife funktioniert auch:
var p = Promise.resolve();
files.forEach(function(file) {
p = p.then(downloadFile.bind(null, file));
});
p.then(_ => console.log('done'));
Eine Kette von Versprechen erhalten Sie nur das Ergebnis der letzten Versprechen in der Kette, während mapSeries()
gibt Ihnen ein Array mit dem Ergebnis jedes Versprechens.
Drossel verwendet wird, gibt es eine Situation ähnlich wie bei Ihnen mit einer Antwort hier: How to chain a variable number of promises in Q, in order?
Dies scheint eine anständige Lösung, aber meiner Meinung nach viel weniger lesbar und elegant wie async.eachSeries (Ich weiß, Sie sagen, Sie Ich möchte nicht die "async" -Lösung, aber vielleicht können Sie es überdenken.
- 1. Warum der Name "Unterstrich" oder "Lodash"?
- 2. Wie man ein assoziatives Array iteriert
- 3. Wie man ein gezacktes Array iteriert?
- 4. Wie man durch Objekte innerhalb des Feldes in Lodash iteriert
- 5. Wie konvertiert man Array mit Lodash?
- 6. Javascript: Transform Array von Objekt-Antwort über lodash oder Unterstrich oder Corejavascript
- 7. zusammenführen Objekteigenschaften in ein Array mit Unterstrich
- 8. Wie man Tupel iteriert oder abbildet?
- 9. Wie man über ein Array von Arrays iteriert
- 10. Teilen eines jsonarray basierend auf Schlüssel mit lodash Unterstrich
- 11. Wie konvertiert man ein Array zu einem Objekt in Lodash?
- 12. Wie man Array-Kombinationen mit konstanter Summe effizient iteriert?
- 13. Ansible: Wie man über eine Rolle mit einem Array iteriert?
- 14. Wie man über ein TR1-Tupel iteriert
- 15. Wie man durch ein fd_set iteriert
- 16. Wie man durch ein Javascript-Objekt iteriert?
- 17. Lodash - Array bekommen
- 18. Wie man mit For-Schleifen über ein Wörterbuch iteriert?
- 19. Lodash forJedes assoziative Array
- 20. Lodash Schleife durch ein Array von Arrays
- 21. Wie spezifiziert man ein Array oder ein Listenelement mit yaml?
- 22. Wie man das Array von JSON-Objekten (Gson) Iteriert
- 23. Wie man das Array von Objekteigenschaften mit Javascript oder Lodash neu anordnet
- 24. Lodash: Scheibe Array und ein bestimmtes Element
- 25. Mit lodash überprüfen, ob ein Array doppelte Werte hat
- 26. Wie iteriert man über ein Array, das mit select-object erstellt wurde
- 27. Wie man ein benutzerdefiniertes inneres Array-Objekt mit dem Lenker iteriert?
- 28. javascript/lodash: wie ein Unterbaumobjekt
- 29. Verwenden von lodash anstelle von Unterstrich in Backbone.js Anwendung
- 30. swap Unterstrich 1.8.3 für Lodash 4.2.1 in Backbone-Marionette 2.4.4
Ohne mapSeries: 'var downloads = []; für (var p = Versprechen.pending(), i = 0; i downloadFile (dateien [i]))); return Promise.all (downloads) ' –
@GorgiKosev Ihr Code funktioniert nicht, aber ja, baut eine Kette von Versprechen würden auch funktionieren. Allerdings ist die Verwendung von 'Promise.all()' hier falsch, Sie machen eine 'Promise.all ([p, p, p])', jede Datei wird mehrmals heruntergeladen. Ich werde meine Antwort mit Ihrem Vorschlag aktualisieren. – Shanoor
Nein, das ist nicht korrekt. Eine Zusage stellt eine Operation dar, die bereits gestartet wurde, und der Versuch, mehrere Male damit zu ketten, führt nicht dazu, dass dieselbe Operation wiederholt wird. Es ist völlig in Ordnung, 'Promise.all' zu verwenden, genauso wie es in Ordnung ist, mehrere' then' Callbacks an ein einzelnes Versprechen anzuhängen. –