我正在使用一个名为findit的模块,它在目标文件夹中递归查找文件并返回事件" file"," error"," end& #34;:
const finder = findit("folder/");
finder.on("file", (file) => {});
finder.on("error", ((error) => {});
finder.on("end", () => {});
当查找程序找到所有文件时,将调用结束事件...但是,在文件事件中我正在进行异步操作,只有当文件内有内容时才分开文件:
const finder = findit("folder/");
let neededFiles = [];
finder.on("file", (file) => {
// async operation here to store only the files that i want
// neededFiles = [...neededFiles, file];
});
finder.on("error", ((error) => {});
finder.on("end", () => {
console.log(neededFiles); // empty array
});
requiredFile将为空,因为异步操作尚未完成。我的问题是:在结束事件中等待异步操作需要做些什么?
感谢。
答案 0 :(得分:1)
由于你只提供了一个临时应用程序,我尝试构建它,并展示如何将其包装到处理异步部分的承诺中。
function find(folder){
return new Promise((resolve, reject) => {
const finder = findit(folder);
const files = [];
finder.on("file", (file) => {
//do stuff like
//files.push(valueOrPromise);
//or
//files.push( find(anotherPath) );
});
finder.on("error", reject);
finder.on("end", () => {
//this line finally "returns" the result.
//to this point you can modify files as you wish
resolve( Promise.all(files) );
//hint, if you're working with recursive stuff, you may have nested Arrays, so you should flatten the result
//resolve( Promise.all(files).then(values => values.reduce((a,b) => a.concat(b), [])) )
});
})
}
通常人们会在这一点上问:为什么我需要承诺?因为它们实现了异步任务的状态管理;那你为什么要自己实施呢?
答案 1 :(得分:0)
为什么不使用'结束'在'文件中?有些人喜欢:
finder.on("file", (file) => {
// async operation here to store only the files that i want
// neededFiles = [...neededFiles, file]; // GENERATE A PROMISE SO U CAN CHAIN THEN FUNCTION
neededFilesPromise.then(function(neededFiles){
finder.on("end", () => {
console.log(neededFiles); // empty array
});
}).catch(function() {
finder.on("error", ((error) => {});;
})
});
答案 2 :(得分:0)
我想说这是Promise.all()的完美用例。所以这样的事情。您可能希望'promisify'您的文件操作,因此它更清晰(如果您使用像bluebird这样的东西来取代本机的承诺)。我不确定你的lib是否返回文件内容或文件名
Private Sub ExportExcel()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "your_query", "C:\your_path_here\your_excel_file.xlsx", True
End Sub