我试图首先解压缩文件,然后等待解压缩文件完成,然后我遍历每个文件并将其上传到S3存储桶。第一个函数unzipPromise
运行正常,一切都在正确的目录中解压缩,但uploadS3Promise
根本没有运行。我没有通过这个过程得到错误,它只是运行并解压缩文件,从不接触uploadS3Promise
函数。
function unzipInput(file, client, project_number, oldpath, newpath) {
path = `zips/${client}/${project_number}/${file}/`;
function unzipPromise() {
return new Promise((resolve, reject) => {
fse.mkdirsSync(path);
fs.rename(oldpath, newpath, err => {
if (err) {
throw err;
}
});
fs.createReadStream(newpath).pipe(unzip.Extract({ path }));
});
}
function uploadS3Promise() {
console.log("running");
return new Promise((resolve, reject) => {
// fs.unlinkSync(newpath);
fs.readdirSync(newpath).forEach(file => {
uploadToS3(file, client, project_number, path);
console.log(file, "test");
});
if (err) reject(err);
else resolve("success");
});
}
// New code with async:
(async () => {
try {
await unzipPromise();
await uploadS3Promise();
} catch (e) {
console.error(e);
}
})();
}
uploadS3Promise无法运行,因为代码仍在等待unzipPromise完成。除非您解决或拒绝承诺,否则代码将不会进一步执行。
所以你的代码......
function unzipPromise(){
...
resolve(...)
...
}
在一个不相关的说明中,我认为如果不将函数名称命名为promise,那将更具可读性。就像把它们称为unzip和uploadS3一样。我们通常不会通过返回类型来命名我们的函数,就像我们从不说intIndexOf一样,依此类推。
你应该在解压缩路径完成后调用resolve
,或者如果发生错误则调用reject
。由于流是EventEmitter,您可以收听事件并与之交互
const stream = fs.createReadStream(newpath).pipe(unzip.Extract({ path }))
stream
.on('error', (err) => reject(err))
.on('finish', () => resolve())
就个人而言,我会使用.then稍微打破这个过程。
unzipPromise().then(res => {
console.log('resolved promise 1');
uploadS3Promise();
} rej => {
console.log('rejected promise 1, sorry!');
});
此外 - “unzipInput”永远不会被解决或拒绝。