【发布时间】:2017-03-02 01:16:12
【问题描述】:
这是我第一次使用 Promise,所以我使用 bluebird 库来完成我的任务,在下面的代码中,我有来自客户端的字符串输入,我必须在文件系统中搜索。所以我必须遍历 dir 并检查该字符串是否与任何文件匹配将该行推送到results 所以一旦forEach 完成我想将results 发送给客户端。我如何使用 Promise 完成该任务?以下代码错误
Error: Unhandled rejection TypeError: expecting an array or an iterable object but got [object Null]
app.js
searchFileService.readFile(searchTxt, logFiles, function(lines, err) {
console.log('Logs', lines);
if (err)
return res.send();
res.json(lines);
})
promises.js
function readFile(str,logFiles,callback){
searchStr = str;
return Promise.map(logFiles, function(logfile) {
return new Promise(function(resolve, reject) {
fs.readFile('logs/dit/' + logfile.filename, 'utf8', function(err, data) {
if (err) {
callback(null,err);
return; // **** Make sure not to run the code below!
}
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);
}
});
});
})
});
//}
}
Promise
.all(readFile())
.then(function() {
console.log('done');
callback(results);
});
【问题讨论】:
-
您在调用 readFile() 时忘记添加参数!
-
我从客户端获得的那些参数,我如何通过它来保证它会在我启动应用程序时抛出未定义。
-
就我个人而言,我发现 Promise 丑得要命。 Async.js 更易于阅读和理解。
-
嗯我使用的是异步,但我无法解决这个问题,请参阅此处提出的问题stackoverflow.com/questions/42519121/…
-
@Mikey 在 nodebacks 中的错误处理比地狱还难看,async.js 中没有任何东西可以让我们摆脱它们。
标签: javascript node.js promise bluebird