我试图在一个对象数组上运行异步循环async.each
。
在数组中的每个对象上,我尝试按顺序运行两个函数(使用promises
)。问题是async.each
仅针对第一个关键字运行。
在以下代码中,getKeywords
从文件中加载一些关键字,然后返回一个关键字对象数组。每个关键字对象都放入searchKeyword
进行搜索。然后使用InsertSearchResults
将搜索结果放入数据库。
在我看来,每个关键字都应该并行处理,搜索和插入功能是相互关联的。
getKeywords(keys).then(function(keywords) {
async.each(keywords, function(keywordObject, callback) {
searchKeyword(keywordObject).then(function(searchResults) {
return insertSearchResults(searchResults, db, collections);
}).then(function(result) {
console.log("here");
callback();
})
})
})
答案 0 :(得分:0)
您只使用.then()
个回调,因此您处理成功。
但是你还应该添加一些.catch()
回调来处理错误。
很可能你得到的错误是没有处理的,没有任何反应。
例如:
// ...
}).then( function(result) {
console.log("here");
callback();
}).catch(function (error) {
console.log('Error:', error);
callback(error);
});
答案 1 :(得分:0)
事实证明我在getKeywords函数中犯了一个错误。 我正在读取文件,然后使用for循环遍历每一行并将结果推送到数组。然后该函数返回该数组。
async.each工作正常,但只接收了一个长度为1的数组来迭代。
我通过将for循环更改为async.each循环
来解决此问题function getKeywords(keywordsFilename){
//get keywords from the file
return new Promise( function (resolve, reject) {
var keywords = [];
fs.readFile(keywordsFilename, function read(err, data) {
if (err) {
reject(err);
}
content = data.toString();
var lines = content.split("\n");
async.each(lines, function(line, callback) {
if (line[0] === "#" || line == "") {
callback();
}
else {
keywords.push(extractKeyword(line));
callback();
}
}, function (err) {
resolve(keywords);
});
});
});
}
写出问题有帮助,请告诉我是否应该删除问题。
感谢你的帮助Mukesh Sharma和rsp。