asynchronous获取文件夹中的文件?

我在Node.js中是新的。 我在这里所做的是获取文件夹中的文件列表… Node.js中的一切似乎是asynchronous,但我的function,我想同步的方式。 所以,我做如下。

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"] 

但是当我将该函数分配给variables

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

它总是没有返回任何东西 ,我认为getFiles()运行在另一个线程,所以不能接收数据的价值。 感谢您的阅读。

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

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

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

  • asynchronous函数在准备好之前返回
  • 你不能在你自己的代码中返回那些不存在的数据
  • asynchronous函数通常需要一个callback参数,当它们准备就绪时执行
  • 你自己的代码可以要求自己的callback

`

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

`