Javascript 如何对使用nodejs的回调使用async?
我有搜索功能,一旦我有了clinet中的搜索字符串,我想在文件中循环并匹配fs中文件中的字符串,我在循环中遇到问题,我想获得所有匹配结果并将结果发送给客户端。下面是试图实现但粘贴错误的问题。异步库新手,如有任何帮助,将不胜感激 app.jsJavascript 如何对使用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
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);
});
});