Привет, я довольно новичок в Javascript, Nodejs и его асинхронном мире, и я пытаюсь получить размер списка папок (например, du command) асинхронным способом. Что-то вроде:Nodejs асинхронный рекурсивный размер папки
du = function(directory, callback){
...
}
displaySum = function(err, result) {
if(!err) {console.log(result);}
}
var folders = ['/folder1', '/folder2', '/folder3'];
for (var i = 0; i < folders.length; i++) {
du(folders[i], displaySum);
}
То, что я ожидал, чтобы получить результат от обратного вызова в качестве asyinch способом так, когда du
покрытие для folderN обратного вызова распечатывает результат для folderN.
Я попытался с помощью этого кода из here, который использует Карринг и закрытия:
//Pseudocode
duAsync4 = (dir,cb) ->
total = 0
file_counter = 1 #starts at one because of the initial directory
async_running = 0
again = (current_dir) ->
fs.lstat current_dir, (err, stat) ->
if err then file_counter--; return
if stat.isFile()
file_counter--
total += stat.size
else if stat.isDirectory()
file_counter--
async_running++
fs.readdir current_dir, (err,files) ->
async_running--
if err then return #console.log err.message
file_counter += files.length
for file in files
again path.join(current_dir, file)
else
file_counter--
if file_counter is 0 and async_running is 0
cb(null, total)
again dir
Проблема я получил с этим кодом, который использует CLOSURES является то, что если второй вызов du
начинается, когда первый вызов все еще выполняется, все перепутано, потому что Closure повторно использует текущие значения для total, file_counter и async_running.
Спасибо за ваши ответы, используя обещание, но первым я бы как понять основные понятия асинхронных nodejs (используя обратные вызовы), а затем использовать библиотеку andvaced, такую как Promise или Asynch. – Ettore