2016-05-14 38 views
3

我使用client.uploadpkgcloud上傳文件的目錄。所有流完成後執行回調的最佳方式是什麼?是否有內置的方法來註冊每個流的「完成」事件並在全部觸發後執行回調?等待所有流完成 - 流文件目錄

var filesToUpload = fs.readdirSync("./local_path"); // will make this async 

for(let file of filesToUpload) { 
    var writeStream = client.upload({ 
     container: "mycontainer, 
     remote: file 
    }); 
    // seems like i should register finish events with something 
    writeStream.on("finish", registerThisWithSomething); 
    fs.createReadStream("./local_path/" + file).pipe(writeStream); 
} 
+0

您可以使用async.js爲這種問題。您可以使用async.js提供的方法作爲'async.waterfall()'。一個函數的結果將作爲回調參數傳遞給另一個函數。您應該查看它的文檔。 –

回答

8

一種方式做到這一點,是生成每次上傳一個Promise任務,然後利用Promise.all()

假設你正在使用ES6,代碼會是這個樣子:

const uploadTasks = filesToUpload.map((file) => new Promise((resolve, reject) => { 
    var writeStream = client.upload({ 
     container: "mycontainer, 
     remote: file 
    }); 
    // seems like i should register finish events with something 
    writeStream.on("finish", resolve); 
    fs.createReadStream("./local_path/" + file).pipe(writeStream); 
}); 

Promise.all(uploadTasks) 
    .then(() => { console.log('All uploads completed.'); }); 
+0

謝謝你這個作品! – berg

0

看看NodeDir,它具有類似的方法readFilesStream/promiseFiles