获取文件夹中的文件时异步?

时间:2013-08-12 03:19:47

标签: javascript node.js

我是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));

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

2 个答案:

答案 0 :(得分:2)

通过概述应用程序运行时的流程,我可以了解您遇到的行为:

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

答案 1 :(得分:1)

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

`

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) });
});

`