我正在寻找一种方法来检查是否已经在没有try {document.save()} catch (e) {if (e.name == 'ParallelSaveError') {...}}
的情况下保存了文档,但是一些快速谷歌搜索却找不到这种东西。
(猫鼬版本5.7.3,以前)
上下文,因为我觉得自己可能有XY Problem的风险:
从不同的端点更新同一对象时,我想避免使用ParallelSaveError
,出于各种原因,我正在使用缓存的对象。我正在考虑编写一个saveDebounce
函数,该函数主要执行以下操作:
我完全疯了吗?更加明智的解决方案涉及不以这种方式使用缓存,还是使用Model.update(...)
而不是document.save()
?
(实际上,在这里很难使用Model.update
,因为我不仅要覆盖数据,还需要合并数据,但是我想我可以获取精益数据,创建合并数据版本,然后更新db中的对象,然后使用该更新的版本刷新缓存...)
答案 0 :(得分:0)
好的,这就是我所用的。较短的去抖动时间似乎太快了。我没有在任何地方使用它,而是在可能与其他东西并行调用的主要地方,例如与前端操作关联的端点,这些端点通常基本上同时导致多个 PUT
请求。>
似乎工作得很好,让我可以使用所有原始的 pre validate
和 pre save
挂钩。如果结果是一场灾难,我会更新这篇文章?
UserSchema.methods.saveWithRetriesForParallelism = async function () {
if (arguments.length) {throw new Error("Warning: saveWithRetriesForParallelism doesn't support callbacks")}
const user = this
const nRetries = 5
let debounceTime = 100
try {
return await user.save()
} catch (err) {
if (err.name !== 'ParallelSaveError') {
throw err
}
for (var i = 0; i < nRetries; i++) {
console.log("ParallelSaveError - retry in " + debounceTime)
await cu.waitNmillis(debounceTime)
try {
return await user.save()
} catch (err2) {
if (err.name !== 'ParallelSaveError') {
throw err2
}
debounceTime*=2
}
}
throw err
}
}