javascript - 回调已经被调用

标签 javascript node.js asynchronous

当我尝试在 Node.js 的 async.waterfall 中使用 list.forEach 方法时,出现错误消息: if (fn === null) throw new Error("回调已被调用。");

错误:回调已被调用。

我想要的是对目录中的每个文件进行一些更改。

/**
 * Created by slow_time on 2017/3/22.
 */
var fs = require('fs');
var async = require('async');
var _dir = './data/';
//writeStream is used to log something
var writeStream = fs.createWriteStream('log.txt',
    {
        'flags': 'a',
        'encoding': 'utf8',
        'mode': 0666
    });

try {
    //use the method waterfall
    async.waterfall([
        //read the directory
        function (callback) {
            fs.readdir(_dir, function (err, files) {
                callback(err, files);
            });
        },
        function (files, callback) {
            //Here is what I guess, something wrong with it
            files.forEach(function (name) {
                callback(null, name);
            });
        },
        //The code below is right, I think.
        function (file, callback) {
            fs.stat(_dir + file, function (err, stats) {
                if(stats.isFile())
                    callback(err, stats, file);
            });
        },
        //judge whether it is a file or a directory
        function (stats, file, callback) {
            fs.readFile(_dir + file, 'utf8', function (err, data) {
                callback(err, file, data);
            });
        },
        // do some changes to the file content
        function (file, data, callback) {
            var adjData = data.replace(/somecompany\.com/g, 'burningbird.net');
            fs.writeFile(_dir + file, adjData, function (err) {
                callback(err, file);
            });
        },
        //write the changes back to the file
        function (file, callback) {
            writeStream.write('changed ' + file + '\n', 'utf8', function (err) {
                callback(err, file);
            });
        }
    ], function (err, result) {
        if(err) throw err;
        console.log('modified ' + result);
    });
} catch(err) {
    console.log(err);
}

最佳答案

当您在 foreach 中调用回调时,会出现错误。 您的代码 -

files.forEach(function (name) {
   callback(null, name);
});

回调应该只在您完成操作后调用一次。 因此,请进行以下更改:

files.forEach(function (name) {

});
callback(null, name);

关于javascript - 回调已经被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42953562/

相关文章:

javascript - 二叉搜索树添加方法不对每个输入进行排序 - JavaScript

javascript - 如何在 ES6 中获取类函数的引用?

c# - await 仍然阻塞当前的 UI 线程

javascript - React HTMLAudioElement 不会暂停

javascript - WebUSB 无法连接,因为另一台设备正在使用相同的接口(interface)

mysql - 如何在 REST 服务器(NodeJS、MySQL)的 PUT 方法中传递正确的参数

javascript - AngularJS 在事件处理程序(Jasmine)之后使用异步请求测试 Controller

javascript - angularjs中的异步调用

javascript - HTML 在提交时发布特定值

javascript - localStorage突然坏了