已使用异步调用回调?

侯赛因

一旦fs.readFile遍历所有文件并获取匹配数据并将其推送到结果,我想调用callback(results)以便我可以向客户端发送响应。我收到以下代码的错误我如何Error: Callback is already called使用async方法解决此问题

应用程序.js

searchFileService.readFile(searchTxt, logFiles, function(lines, err) {
    console.log('Logs', lines);
    if (err)
        return res.send();
    res.json(lines);
})

读取文件.js

var searchStr;
var results = [];

function readFile(str,logFiles,callback){
   searchStr = str;
    async.map(logFiles, function(logfile, callback) {
           fs.readFile('logs/dit/' + logfile.filename, 'utf8', function(err, data) {
               if (err) {
                   callback(null,err);
               }
               var lines = data.split('\n'); // get the lines
               lines.forEach(function(line) { // for each line in lines
                   if (line.indexOf(searchStr) != -1) { // if the line contain the searchSt
                       results.push(line);
                       callback(results,null);
                   }
               });
            });
    }), function(error, result) {
         results.map(result,function (result){
             console.log(result);
         });
    };
}
米奇

注意:这个答案是特林科特答案的延伸因此,如果这回答了您的问题,请将其标记为答案!

你说:一旦 fs.readFile 循环遍历所有文件并获取匹配的数据并将其推送到结果中,老实说,我认为.map不是合适的函数。这是用于将数组中的每个元素转换为另一个元素,这不是您正在做的。

更好的方法是.eachSeries 一次读取一个文件。

将您的第二个重命名callback为其他名称是个好主意,例如done不要混淆您自己(和其他人)。调用done()是为了告诉我们对文件的操作已经完成,因为我们已经“完成”了读取文件。

最后,小心你的错别字。第一个可能阻止您进入最后一部分。

var results = [];
var searchStr;

function readFile(str, logFiles, callback) {
    searchStr = str;
    // loop through each file
    async.eachSeries(logFiles, function (logfile, done) {
        // read file
        fs.readFile('logs/dit/' + logfile.filename, 'utf8', function (err, data) {
            if (err) {
                return done(err);
            }
            var lines = data.split('\n'); // get the lines
            lines.forEach(function(line) { // for each line in lines
                if (line.indexOf(searchStr) != -1) { // if the line contain the searchSt
                    results.push(line);  
                }
            });
            // when you are done reading the file
            done();
        });

    // wrong: }), function (err) {
    }, function (err) {
        if (err) {
            console.log('error', err);
        }
        console.log('all done: ', results);

        // wrong: results.map(result, function (result){
        results.map(function (result){
            console.log(result);
        });

        // send back results
        callback(results);
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

中止先前的异步调用并处置已使用的资源

来自分类Dev

使用Rhino从Java方法异步调用JavaScript回调

来自分类Dev

如何使用回调在Swift中进行异步调用,以使主UI不挂起?

来自分类Dev

访问异步调用的回调参数

来自分类Dev

多次异步调用后回调?

来自分类Dev

当我使用Realm执行异步事务时,永远不会调用回调

来自分类Dev

如何使用 React JS 为从辅助方法到 componentDidMount 的异步调用编写回调函数

来自分类Dev

caolon异步-永远不会调用回调

来自分类Dev

使用回调函数调用Ajax服务

来自分类Dev

如何使用参数调用回调函数?

来自分类Dev

如何使用参数调用回调函数

来自分类Dev

javascript-使用参数调用回调

来自分类Dev

从QML到带回调的Python的异步调用

来自分类Dev

Nodejs异步调用排水回调完成之前

来自分类Dev

使用Java线程进行异步调用

来自分类Dev

使用异步调用自动重新登录

来自分类Dev

如何使用 mockito 存根异步调用?

来自分类Dev

使用 xCode 进行异步调用

来自分类Dev

使用 Promise 共享异步调用的结果

来自分类Dev

使用Ajax提交表单,使用回调异步提交

来自分类Dev

如何在Scrapy / Twisted中使用线程,即如何在响应回调中异步调用阻塞代码?

来自分类Dev

用回调执行异步功能?

来自分类Dev

异步调用方法

来自分类Dev

角度异步调用

来自分类Dev

与委托的异步调用

来自分类Dev

OnContextItemSelected异步调用

来自分类Dev

承诺异步调用

来自分类Dev

通过许多异步调用在WebAPI中使用异步

来自分类Dev

调用异步方法时,StreamWriter使用同步调用