【发布时间】:2017-03-13 19:12:36
【问题描述】:
我正在编写一个节点 js 函数,它解压缩文件并进一步读取解压缩的文件以进一步处理。问题是,在文件被异步解压缩之前,读取功能启动并且它失败并出现文件未找到错误。请建议在读取文件触发器之前等待解压缩过程的可能方法。
【问题讨论】:
标签: node.js asynchronous
我正在编写一个节点 js 函数,它解压缩文件并进一步读取解压缩的文件以进一步处理。问题是,在文件被异步解压缩之前,读取功能启动并且它失败并出现文件未找到错误。请建议在读取文件触发器之前等待解压缩过程的可能方法。
【问题讨论】:
标签: node.js asynchronous
看看这里:
https://blog.risingstack.com/node-hero-async-programming-in-node-js/
Node Hero - 了解 Node.js 中的异步编程
这是名为 Node Hero 的教程系列的第三篇文章 - 在这些章节中,您可以了解如何开始使用 Node.js 并使用它交付软件产品。
在本章中,我将指导您了解异步编程原理,并向您展示如何在 JavaScript 和 Node.js 中进行异步操作。
【讨论】:
感谢您的回答,我已经使用以下代码 -
fs.createReadStream('master.zip')
.pipe(unzip.Extract({ path: 'gitdownloads/repo' }))
.on('close', function () {
...
});
【讨论】:
异步库(http://caolan.github.io/async/)
此库用于控制您拥有的功能的执行。
例如:
async.series({
unzip: function(callback) {
unzip('package.zip', function(err, data) {
if(!err)
callback(null, data);
});
}
}, function(err, results) {
// results is now equal to: {unzip: data}
readingUnzipFiles(...);
});
这里 readingUnzipFiles 会在解压任务调用回调函数后执行。
承诺
另一种解决方案是使用类似 Q(https://github.com/kriskowal/q) 的承诺模块:
function unzip(fileName, outputPath) {
var deferred = Q.defer();
fs.createReadStream(fileName)
.pipe(unzip.Extract({ path: outputPath }))
.on('end', function(){
deferred.resolve(result);
});
return deferred.promise;
}
然后你可以使用如下函数:
unzip('file.zip', '/output').then(function() {
processZipFiles();
});
【讨论】: