Javascript 如何对使用nodejs的回调使用async?

Javascript 如何对使用nodejs的回调使用async?,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我有搜索功能,一旦我有了clinet中的搜索字符串,我想在文件中循环并匹配fs中文件中的字符串,我在循环中遇到问题,我想获得所有匹配结果并将结果发送给客户端。下面是试图实现但粘贴错误的问题。异步库新手,如有任何帮助,将不胜感激 app.js app.get('/serverSearch', function (req, res) { var searchTxt = req.query.searchTxt; dirDirectory.readDirectory(function(l

我有搜索功能,一旦我有了clinet中的搜索字符串,我想在文件中循环并匹配fs中文件中的字符串,我在循环中遇到问题,我想获得所有匹配结果并将结果发送给客户端。下面是试图实现但粘贴错误的问题。异步库新手,如有任何帮助,将不胜感激

app.js

app.get('/serverSearch', function (req, res) {
    var searchTxt = req.query.searchTxt;
    dirDirectory.readDirectory(function(logFiles){
        // res.json(logFiles);
        if(logFiles){
            searchFileService.readFile(searchTxt,logFiles,function(lines,err){
                        console.log('Logs',lines);
                          if (err)
                           return res.send();
                           res.json(lines);
                    })

        }
    });

    console.log('Search text', searchTxt);
});
service.js

var fs = require('fs');
var path = require('path');
var async = require('async');
var searchStr;
var result = [];


//Async Method
function readFile(str, logFiles, callback) {
    async.series([
        //Load user to get `userId` first
        function(callback) {
            searchStr = str;
            for (var i = 0; i < logFiles.length; i++) {
                if (logFiles[i].filename !== '.gitignore') {
                    fs.readFile('logs/dit/' + logFiles[i].filename, 'utf8', function(err, data) {
                        if (err) {
                            return console.log(err);
                        }
                        inspectFile(data);
                    });
                }
                callback(result);
            }
        },
        //Load posts (won't be called before task 1's "task callback" has been called)
        function() {
            function inspectFile(data, callback) {
                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
                        result.push(line);
                        // then log it
                        return line;
                    }
                });
            }
        }
    ], function(err) { //This function gets called after the two tasks have called their "task callbacks"
        if (err) return err;
    });
};
你应使用:


我建议在使用async.eachSeries函数之前加载用户和帖子。

您应该使用
async.map
而不是series。您无法理解series做什么,series处理自上而下的请求。您试图通过访问系列本身中的函数来打破此链。这是一个不,不

例如:

async.series([
    function() {
        let i = 0;
        do {
            console.log("I'm first in the series: ", i);
            i++;
        } while (i < 3);
        callback(); // This tells us this function has finished.
    },
    function() {
        let i = 0;
        do {
            console.log("I'm next in the series: ", i);
            i++;
        } while (i < 3);
        callback(); // This tells us this function has finished.
    }
]);
另外,您应该使用util.inspect而不是console.log,它更干净,并且有更多的选项


关于这方面的文档有点粗糙,但在这里。希望这有帮助

我试图解决的代码中存在一些语法问题是的,对不起,我混合了ES6和ES5,但它应该接近您所需要的。希望有帮助@hussain yea,这就是告诉map继续前进的原因。明白了,nodejs的新手我试图修复它令人困惑的语法错误,但如果您能帮助修复,它在其他行上会出现中断。我将非常感谢它在语法问题解决后获得此错误
if(fn==null)抛出新错误(“已调用回调”);                              ^  错误:已调用回调。
其错误与我在代码中遇到的错误相同您的代码正在工作,其打印所有数组都已成功处理,但未将结果发送到client@hussain现在呢?我已经更新了答案。我不知道您还需要解决对客户端的回调。
function readFile(str, logFiles, callback) {
    async.eachSeries(array, function(item, cb){
       //Process item
       cb(error,item);
    }, function(err){
       if (err) {
           console.log("Some error in one of the items");
           callback(err);
       } else {
           console.log("All arrays items have been treated successfully");
           callback(null);
       }
    });
}
async.series([
    function() {
        let i = 0;
        do {
            console.log("I'm first in the series: ", i);
            i++;
        } while (i < 3);
        callback(); // This tells us this function has finished.
    },
    function() {
        let i = 0;
        do {
            console.log("I'm next in the series: ", i);
            i++;
        } while (i < 3);
        callback(); // This tells us this function has finished.
    }
]);
var results = [];
async.map(logFiles, function(logfile, callback) {
    if (logfile.filename !== '.gitignore') {
       fs.readFile('logs/dit/' + logfile.filename, 'utf8', function(err, data) {
           if (err) {
               callback(err, null);
           }
           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(null, results);
               }
           });
    }
}), function(error, result) {
     results.map(result => {
         console.log(result);
     });
});