手头这个脚本原来是这么写的
fs.createReadStream(file_path)
.pipe(unzip.Extract({ path: wow_path + '/Interface/addons' }))
.on("close", function(){
console.log(name + " 解压完毕");
if (cb) {
cb();
}
})
这样写的问题是,如果zip文件有错,整个脚本就会非正常退出
(error是invalid signature)
所以我加了一个error事件处理
fs.createReadStream(file_path)
.pipe(unzip.Extract({ path: wow_path + '/Interface/addons' }))
.on("close", function(){
console.log(name + " 解压完毕");
if (cb) {
cb();
}
})
.on("error", (e) => {
console.log(`${name} 解压出错:${e.message}`)
if (cb) {
cb(e);
}
});
这样写的问题是,同一个压缩包实际上不会只出一个错,我这个zip就会触发三次error事件
于是cb函数就被触发了三次
而且也不能把error事件里的cb去掉,因为我发现如果发生了错误,close消息会一直无法返回
如此一来,外面的大循环又会一直卡主
当然,我加了个flag,检查一下cb第几次返回,也能让cb只返回一次
这样一来整个程序的执行顺序倒是没问题了
但是整个脚本执行完之后不会退出,如此看来,前面的unzip过程实际上还是没有结束
这里到底应该怎么写呢