Javascript 如何强制Mongoose Save()调用是同步的
我正在Node.js中编写一个脚本,需要执行以下操作:Javascript 如何强制Mongoose Save()调用是同步的,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我正在Node.js中编写一个脚本,需要执行以下操作: 打开XML文件 对于文件中的每个节点 执行mongodb查找以尝试查找与此节点相关的对象 如果找不到对象,则创建它,否则以某种方式操纵找到的对象 将(可能是新的)对象保存回数据库 转到步骤2 我已经对此研究了一段时间,并得出结论,使用异步mongodb几乎不可能做到这一点。问题是多方面的,但例如,如果处理20000个这样的节点,那么异步执行将挂起脚本。但是,将它们作为批插入执行也不可行,因为步骤4需要查看对象是否已经存在 可以将一些可怕的东
models('hs').findOne({name: r2.$.name}, function (err, h) {
if (err) {
console.log(err);
} else {
var resultObj = createResult(meeting, r1, r2);
if (h == undefined) {
var hObj = new models('hs')({
name : r2.$.name,
results : [resultObj],
numResults : 1
});
hObj.save();
} else {
h.results.push(resultObj);
h.numResults++;
h.save();
}
}
});
从页面:
eachSeries(arr、迭代器、回调)
与每个相同,只有迭代器应用于arr中的每个项
系列下一个迭代器只有在当前迭代器完成后才被调用
完整的。这意味着迭代器函数将按顺序完成
因此,假设在节点中有XML节点
是的,但是如果有可用的库,您可能会重新考虑您的流程,这将允许您按顺序执行某些操作,而不是完全同步。如果你的问题中没有一些代码可以应用示例,那么这不是一个真正的答案。请尝试查找。此外,您可能会使用一些流式解决方案来读取XML,以便与它很好地集成。我确实看过async,但它似乎没有办法说“调用此函数,直到其回调执行后才返回”。我错了吗?你错了
async.series
,async.parallelLimit
,async.eachLimit
所有序列化执行。我想看看如何在上述代码中使用async.series使save()同步。我可能弄错了——他们的文档中没有很多简单的异步示例,只有一系列复杂的示例。谢谢,这是正确的。我最终使用了async.eachSeries()和async.series的组合,经过一些修改,一切都很好。我认为问题的一部分是我有太多的函数相互调用,以至于我不知道如何将最终保存链接回更高级别的forEach。
async.eachSeries(
nodes,
// This will be applied to every node in nodes
function (node, callback) {
models('hs').findOne({name: r2.$.name}, function (err, h) {
if (err) {
console.log(err);
} else {
// Async?
var resultObj = createResult(meeting, r1, r2);
if (h == undefined) {
var hObj = new models('hs')({
name : r2.$.name,
results : [resultObj],
numResults : 1
});
hObj.save(function (err, p) {
// Callback will tell async that you are done
callback();
});
} else {
h.results.push(resultObj);
h.numResults++;
h.save(function (err, p) {
// Callback will tell async that you are done
callback();
});
}
}
});
},
// This will be executed when all nodes has been processed
function (err) {
console.log('done!');
}
);