1

我是 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()在另一个线程中运行所以无法接收数据值。感谢您的阅读。

4

2 回答 2

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

于 2013-08-12T03:30:55.517 回答
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) });
});

`

于 2013-08-12T03:32:22.117 回答