我正在研究一個使用文件樹的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);
});
});
});
}
我努力將此代碼格式化爲10分鐘。我想,該系統不喜歡我的語法。也許主持人可以解決這個問題? –
此方法有效:http://grammerjack.blogspot.jp/2010/12/asynchronous-directory-tree-walk-in.html – arcseldon