异步获取文件夹中的文件

Async in getting files in folder?

本文关键字:文件 文件夹 获取 异步      更新时间:2023-09-26

我是Node.js的新手。我在这里所做的只是在文件夹中获取文件列表。。。Node.js中的所有内容似乎都是异步的,但我的函数我希望它是同步的。所以,我做如下。

function getFiles() {
var file = [];
var walker = walk.walk('./files');
walker.on('file', function (root, stat, next) {
    file.push(root + '/' + stat.name);
    next();
})
walker.on('end', function () {
    console.log(JSON.stringify(file));
})
return file;}

正如我所料:

["./files/1.mp3","./files/2.mp3","./files/3.mp3","./files/4.mp3","./files/5.mp3","./files/6.mp3","./files/7.mp3","./files/8.mp3"]

但当我把这个函数分配给变量时

var list = getFiles();
 response.writeHead(200, {'Content-type':'application/json'});
response.end(JSON.stringify(list));

它总是返回nothing,我认为getFiles()在另一个线程中运行,因此无法接收数据值。感谢您的阅读。

我可以通过概述应用程序运行时的流程来了解您正在经历的行为:

call to getFiles
  declare files array and walker
  bind walker event "file" and "end" to callbacks
  return files array
walker file event fires
walker end event fires

正如您所看到的,方法调用正在带外触发事件。为了解决这个问题,常见的node.js方法是设置如下代码:

function getFiles(callback) {
  var file = [];
  var walker = walk.walk('./files');
  walker.on('file', function (root, stat, next) {
    file.push(root + '/' + stat.name);
    next();
  })
  walker.on('end', function () {
    callback(file);
  })
}

现在,当你执行这个方法时,你会做这样的事情:

getFiles(function(list){
  response.writeHead(200, {'Content-type':'application/json'});
  response.end(JSON.stringify(list));
});

显然,这有点难看,因为控制器现在必须创建一个回调场景,而getFiles方法当然需要执行该回调。另一种方法是使用Promises概念,我将通过以下链接留给读者发现:https://github.com/kriskowal/q

  • 异步函数在准备就绪之前返回
  • 你不能返回你自己代码中没有的数据
  • 异步函数通常采用回调参数,该参数在准备就绪时执行
  • 您自己的代码可以请求自己的回调

`

function getFiles(callBack) {
var file = [];
var walker = walk.walk('./files');
walker.on('file', function (root, stat, next) {
    file.push(root + '/' + stat.name);
    next();
})
walker.on('end', function () {
    console.log(JSON.stringify(file));
    callBack(file);
})
}
// assuming server environment, express, connect, etc...
app.get('/list', function(req, res){
      getFiles(function(D){ res.json(D) });
});

`