Ich möchte viele Bilder (1000 +) herunterladen, so dass ich das Array in Stücke der angegebenen Größe aufteilen und sie nacheinander herunterladen. Die Downloads basieren auf Versprechen und werden aufgelöst, sobald ein Chunk fertig ist. Ohne Verwendung Brocken alles funktioniert gut, aber mit dieser Implementierung geschieht Folgendes:node.js rekursive Download von Chunked-Array mit Versprechen
console.log("Promise Recursive resolved", paths);
in der Funktion downloadRecursive aufgerufen, sobald es fertig ist, aber es löst nicht wie erwartet, so
console.log("Finished");
nicht funktioniert in der downloadAll-Funktion aufgerufen werden.
function downloadAll(folder, full_size, images) {
return new Promise(function (resolve, reject) {
// Chunks of all images [ [1,2,3,4,5], [6,7,8,9,10], [...] ]
let grouped_images = chunk(images, 5);
downloadRecursive(folder, full_size, grouped_images, 1, []).then(function (e) {
console.log("Finished");
resolve(e);
}).catch(function() {
reject();
});
});
}
function downloadRecursive(folder, full_size, all, part, paths) {
return new Promise(function (resolve, reject) {
if(part > all.length){
console.log("Promise Recursive resolved", paths);
resolve(paths);
}
downloadImages(folder, all[part-1], full_size).then(function (e) {
paths.push(e);
return downloadRecursive(folder, full_size, all, part+1, paths);
});
});
}
function downloadImages(folder, images, full_size=true) {
[...]
return Promise.all(images.map(function (image) {
[...]
return doDownload(...);
}));
}
function doDownload(url, path, full_size){
returns promise
}
Sie finden Bluebirds 'Promise.map()' mit seiner Nebenläufigkeitsoption sehr nützlich. Es löst solche Probleme. Wie man eine große Anzahl von asynchronen Operationen mit nicht mehr als N im Flug zur gleichen Zeit ausführt. – jfriend00
Das Erstellen neuer Versprechen ist ein Anti-Pattern. Anstatt "neues Versprechen (...) ..." zu machen und dann "ablehnen/ablehnen" von ".dann" und ".catch" zu nennen, ziehe das "neue Versprechen" ab und gib einfach deine Versprechenskette zurück. Siehe: http://jf.io/2016/10/09/projects#anti-patterns-explicit-construction-promises-everywhere –
Ich stimme dem oben, und das Problem könnte sein, dass Sie nicht nach dem Aufruf 'zurückgeben resolve' in 'downloadRecursive', so dass' downloadImages' um eine zusätzliche Zeit läuft und dies fehlschlagen kann. –