2016-05-14 37 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