Узел асинхронного обратного вызова водопада уже назывался

Я пытаюсь прочитать некоторые файлы из dir с помощью async.waterfall, мне кажется, что я все делаю правильно, но я получаю указанную ошибку, и функция readData никогда не вызывается. В чем дело?

var fs = require("fs");
var async = require("async");

var folder = "./files/";

try {
    async.waterfall([
        function readDir(cb) {
            fs.readdir(folder, function(err, files) {
                cb(err, files);
            });
        },
        function loopFiles(files, cb) {
            files.forEach(function(fn) {
                console.log("loop " + fn);
                cb(null, fn);
            });
        },
        function check(fn, cb) {
            console.log("check "+fn);
            fs.stat(folder + fn, function(err, stats) {
                console.log(stats.isFile());
                cb(err, stats, fn);
            });
        },
        function readData(stats, fn, cb) {
            console.log("read "+fn);
            if (stats.isFile()) {
                fs.readFile(folder + fn, "utf-8", function(err, data) {
                    cb(err, data);
                });
            }
        }
    ], function(err, result) {
        if (err) {
            throw err;
        }
       console.log(result);
    });
} catch (err) {
console.log(err);
}

1 ответ

Решение

Проблема в том, что ты звонишь cb(null, fn) в loopFiles() несколько раз, если files.length > 1, Вам, вероятно, нужно будет выполнить отдельный async.waterfall() или использовать какой-то другой async.* метод для каждого файла.

Еще одна проблема заключается в readData() куда ты не звонишь cb() в том случае, если stats.isFile() оценивает false,

Другие вопросы по тегам