【发布时间】:2014-07-02 16:24:09
【问题描述】:
我正在开发一个使用文件树的 Web 应用程序。前端 JavaScript 向我的 Node.js 服务器执行 ajax 请求,该服务器调用我的 browse2 导出函数。然后,此函数负责为我的函数 getFolderContents() 提供正确的路径,该函数递归地构建文件系统层次结构对象结构。
我的问题是我目前正在同步做事。在研究过 Node.js 的内部工作原理之后,似乎我应该不惜一切代价避免同步操作。因此,我想将我的代码转换为异步工作。但是,我无法让它发挥作用,而且我的所有解决方案都很复杂。
我尝试使用“异步”包管理流程。我没有运气弄清楚这一点。我尝试实现自己的计数器/循环/回调系统来确定进程何时完成执行。最终,我想我无法将注意力集中在异步执行流程上。
我想问两个问题: 1.在这种情况下,同步执行这个请求而不是异步执行这个请求会不会有害? 2.如果第一个问题是,我应该如何将这段代码转换为异步的?
注意:当我尝试异步执行操作时,我使用了每个同步函数的异步对应项。
以下是我的同步(工作)代码:
var path = require('path');
var fs = require('fs');
exports.browse2 = function(request, response) {
var tree = getFolderContents('C:\\Users\\AccountName\\folder1\\folder2\\folder3\\test\\');
response.send(tree);
};
function getFolderContents(route) {
var branch = {};
branch.title = path.basename(route);
branch.folder = true;
branch.children = [];
var files = fs.readdirSync(route);
var size = files.length;
for (var i = 0; i < size; i++) {
var file = files[i];
var concatPath = path.join(route, file);
if (fs.lstatSync(concatPath).isDirectory())
branch.children.push(getFolderContents(concatPath));
else
branch.children.push({
"title" : path.basename(file),
"path" : file
});
}
return branch;
}
感谢所有的意见!
编辑:
添加了异步代码尝试。没有完全工作。只接收到树的一部分。
exports.browse2 = function(request, response) {
getFolderContents(
'C:\\Users\\AccountName\\folder1\\folder2\\folder3\\test\\',
function(tree) {
response.send(tree);
});
};
function getFolderContents(route, callback) {
var branch = {};
branch.title = path.basename(route);
branch.folder = true;
branch.children = [];
fs.readdir(route, function(err, files) {
files.forEach(function(file) {
var concatPath = path.join(route, file);
fs.lstat(concatPath, function(err, stats) {
if (stats.isDirectory())
branch.children.push(getFolderContents(concatPath, callback));
else
branch.children.push({
"title" : path.basename(file),
"path" : file
});
callback(branch);
});
});
});
}
【问题讨论】:
标签: javascript multithreading node.js asynchronous recursion