如何判断 document.save 是否在猫鼬中进行中?



我正在寻找一种方法来检查文档是否已经在没有try {document.save()} catch (e) {if (e.name == 'ParallelSaveError') {...}}的情况下保存,但是一些快速的谷歌搜索没有找到这样的事情。

(猫鼬版本 5.7.3,fwiw(

上下文,因为我觉得我可能有XY问题的风险:

我想在从不同的端点更新同一对象时避免ParallelSaveError,并且出于各种原因,我正在使用缓存的对象。我正在考虑编写一个基本上执行以下操作的saveDebounce函数:

  • 如果已保存,请等到保存,然后再次保存
  • 等待 X 毫秒,然后保存
  • (除非同时调用了保存Debounce,在这种情况下重置计时器(

我完全疯了吗?更明智的解决方案是否涉及不以这种方式使用缓存,或者使用Model.update(...)而不是document.save()

(就其价值而言,在这里Model.update使用有点困难,因为我不仅要覆盖数据,还需要合并它,但我想我可以获取精益,创建合并版本,然后在数据库中更新对象,然后使用更新的版本刷新缓存......

好的,这就是我去的。较短的去抖动时间似乎太快了。我不是在任何地方都使用它,而是在可能与其他内容并行调用的主要位置使用它,例如与前端操作关联的终结点,这些前端操作通常同时导致多个PUT请求。

似乎工作得很好,让我使用我所有的原始pre validatepre 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
}
}

相关内容

最新更新