我试图遍历对象并调用一个异步并具有回调的方法("搜索"),当它完成所有对象时,写入结果对象,即resultSet在json文件中;但现在问题是因为我的搜索功能是异步writefile不等待它们完成然后将结果集写入json文件,所以它将空对象写入json文件;值得一提的是,我不想使用承诺;除了承诺,你能告诉我什么是应对这个问题的最佳方法吗?
router.post('/export', function (req, res) {
Object.keys(models).forEach(function (name) {
resultSet[name] = [];
search(param1, name, function (err, data) {
if (err) {
console.error(req.host, req.path, err, err.stack);
res.json(400, err);
} else {
resultSet[name] = data;
}
});
});
var file = "myFile.json";
jf.writeFile(file,resultSet,function(err){
console.log(err);
});
});
答案 0 :(得分:1)
改为:
function auxFunc(resultSet){
var file = 'myFile.json';
jf.writeFile(file, resultSet, function (err) {
console.log(err);
})
}
router.post('/export', function (req, res) {
var keys = Object.keys(models);
var counter = 1;
keys.forEach(function (name) {
resultSet[name] = [];
search(param1, name, function (err, data) {
if (err) {
console.error(req.host, req.path, err, err.stack);
res.json(400, err);
} else {
resultSet[name] = data;
if(counter++ === keys.length)
auxFunc(resultSet);
}
});
});
});
这是一个控制流问题.. 循环中的回调会创建一个竞争条件,你有很多“进程”自行工作,所以使用计数器你会知道并检测所有进程何时完成,然后你激活你需要的函数。
在处理回调时,不一定要成为一个计数器,这取决于您可能需要处理信息的情况,并且根据触发动作的结果,这可以通过返回布尔值的函数来实现,所以回调的诀窍是总是某个地方的条件来控制流量。