Warum werden Dateien nacheinander heruntergeladen, anstatt gleichzeitig Promise.all() in Electron (Node.js) zu verwenden
Posted: 13 Jan 2025, 13:18
Ich arbeite an einer Electron-App und versuche, mit fs.promises.writeFile() in einer asynchronen Funktion mehrere Dateien gleichzeitig aus einer Ordnerstruktur herunterzuladen, aber die Dateien werden nacheinander und nicht gleichzeitig heruntergeladen obwohl ich Promise.all() verwende. Hier ist meine Implementierung:
Beim Testen mit einem Ordner, der nur Dateien enthält (keine verschachtelten Ordner) oder mit Ordnern mit verschachtelten Ordnern, erfolgen die Downloads jedoch sequentiell, einer nach dem anderen. Hier ist ein Beispiel für die Ordnerstruktur, mit der ich teste:
Ich erwarte, dass die Dateien gleichzeitig heruntergeladen werden, aber sie scheinen im Netzwerk nacheinander heruntergeladen zu werden. Wie kann ich das beheben, um die Dateien parallel herunterzuladen?
Code: Select all
const fs = require('fs');
const path = require('path');
async function downloadFolder(folderName, folderStructure, destinationPath) {
const folderPath = path.join(destinationPath, folderName);
if (!fs.existsSync(folderPath)) {
try {
fs.mkdirSync(folderPath, { recursive: true });
} catch (err) {
throw new Error(`Failed to create folder at ${folderPath}: ${err.message}`);
}
}
try {
const downloadPromises = folderStructure.map((item) => {
const itemPath = path.join(folderPath, item.name);
console.log(`Starting download for: ${itemPath}`);
if (item.type === 'file') {
return fs.promises.writeFile(itemPath, item.content)
.then(() => console.log(`Downloaded: ${itemPath}`))
.catch((err) => {
throw new Error(`Failed to write file at ${itemPath}: ${err.message}`);
});
} else if (item.type === 'folder') {
return downloadFolder(item.name, item.children, folderPath); // Recurse for subfolder
}
});
// Wait for all download promises to resolve concurrently
await Promise.all(downloadPromises);
console.log(`All items in ${folderName} downloaded successfully!`);
} catch (err) {
throw new Error(`Error processing folder ${folderName}: ${err.message}`);
}
}
Code: Select all
folderStructure = [
{ name: '100-mb-example-jpg.jpg', type: 'file', content: /* file data */ },
{ name: '50mb.jpg', type: 'file', content: /* file data */ },
{ name: '70mb.iso', type: 'file', content: /* file data */ }
];