我是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()
在另一个线程中运行,因此无法接收数据值。感谢您的阅读。
答案 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) });
});
`