事件

时间:2017-03-25 18:27:54

标签: javascript file asynchronous find

我正在使用一个名为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将为空,因为异步操作尚未完成。我的问题是:在结束事件中等待异步操作需要做些什么?

感谢。

3 个答案:

答案 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