javascript - 回调中的 Node.js 发射器空数据

标签 javascript node.js angular eventemitter

有一个函数,我用它来读取目录中的所有文件,然后将带有发射器的对象发送到客户端。

这是我的代码,运行良好,

const getFilesList = (path, emitter) => {
  fs.readdir(path, (err, files) => {
    emitter('getFileList', files);
  });
};

但是当我想用这段代码过滤隐藏文件时,'standardFolders' 将在发射器中发送空文件。

const getFilesList = (path, emitter) => {
  let standardFolders = [];
  fs.readdir(path, (err, files) => {
    if (files) {
      files.map((file) => {
        winattr.get(path + file, function (err, attrs) {
          if (err == null && attrs.directory && (!attrs.hidden && !attrs.system)) {
            standardFolders.push(file)
          }
        });
      });
    } else {
      standardFolders = null;
    }
    emitter('getFileList', standardFolders);
  });
};

第二部分我的代码有什么问题?

最佳答案

winattr.get(filepath,callback) 是异步的,所以想象一下您的代码“启动”file.map() 行然后立即跳到 emitter('getFileList',standardFolders) --- standardFolders 是空的,因为它还没有完成!

您可以使用像 async.io 这样的库来处理您的回调函数,或者您可以使用计数器并自行跟踪所有回调(针对每个文件)何时完成。

例子:

// an asynchronous function because setTimeout
function processor(v,cb){
  let delay = Math.random()*2000+500;
  console.log('delay',delay);
  setTimeout(function(){
    console.log('val',v);
    cb(null,v);
  },delay);
  
}
const main = function(){
  const list = ['a','b','c','d'];
  let processed = [];
  let count = 0;
  console.log('starting');
  list.map(function(v,i,a){
    console.log('calling processor');
    processor(v,function(err,value){
      processed.push(v);
      count+=1;
      console.log('count',count);
      if(count>=list.length){
        // all are finished, continue on here. 
        console.log('done');
      }
    })
  })
  console.log('not done yet!');
};
main();

同样,对于您的代码:

const getFilesList = (path, emitter) => {
  let standardFolders = [];
  fs.readdir(path, (err, files) => {
    if (files) {
      let count = 0;
      files.map((file) => {
        winattr.get(path + file, function (err, attrs) {
          if (err == null && attrs.directory && (!attrs.hidden && !attrs.system)) {
            standardFolders.push(file)
          }
          count+=1;
          if(count>=files.length){
            // finally done
            emitter('getFileList', standardFolders);
          }
        });
      });
    } else {
      standardFolders = null;
      emitter('getFileList', standardFolders);
    }

  });
};

关于javascript - 回调中的 Node.js 发射器空数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54005967/

相关文章:

javascript - typescript 输出脚手架的问题(保持结构)

angular - ngStyle 不适用于 Angular2 中的 !important

javascript - 在js文件中包含外部js文件

javascript - 如何捕获浏览器阻止的 XMLHttpRequest?

javascript - 淡出除鼠标指向的元素之外的所有内容

node.js - Angular 7 中 ActiveXObject 的问题

node.js - 发送 SQS 消息超时

javascript - 如何指定本地源路径,例如total.js中node_modules中的 Angular

Angular - 子组件可以引用父组件的模板变量吗?

angular - 动态更改 ngx-datatable 中的行颜色