等待所有流完成 - 流式传输文件目录
wait for all streams to finish - stream a directory of files
我正在使用 client.upload in pkgcloud 上传文件目录。在所有流完成后如何执行回调?是否有内置的方法来注册每个流的“完成”事件并在它们全部触发后执行回调?
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);
}
一种方法是生成 Promise
task for each upload, then utilizing 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.'); });
或者,如果您有权访问 async / await
- 您可以利用它。例如:
const uploadFile = (file) => new Promise((resolve, reject) => {
const writeStream = client.upload({
container: "mycontainer",
remote: file,
});
writeStream.on("finish", resolve);
fs.createReadStream("./local_path/" + file).pipe(writeStream);
}
const uploadFiles = async (files) => {
for(let file of files) {
await uploadFile(file);
}
}
await uploadFiles(filesToUpload);
console.log('All uploads completed.');
看看NodeDir,里面有readFilesStream
/ promiseFiles
等方法
我正在使用 client.upload in pkgcloud 上传文件目录。在所有流完成后如何执行回调?是否有内置的方法来注册每个流的“完成”事件并在它们全部触发后执行回调?
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);
}
一种方法是生成 Promise
task for each upload, then utilizing 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.'); });
或者,如果您有权访问 async / await
- 您可以利用它。例如:
const uploadFile = (file) => new Promise((resolve, reject) => {
const writeStream = client.upload({
container: "mycontainer",
remote: file,
});
writeStream.on("finish", resolve);
fs.createReadStream("./local_path/" + file).pipe(writeStream);
}
const uploadFiles = async (files) => {
for(let file of files) {
await uploadFile(file);
}
}
await uploadFiles(filesToUpload);
console.log('All uploads completed.');
看看NodeDir,里面有readFilesStream
/ promiseFiles
等方法