PouchDB 更新频率高(文档更新冲突)
High frequency updates to PouchDB (Document update conflict)
我有一个存储在 PouchDB 中的 getting/updating 状态方法。此方法由元素的构造函数调用,以将用户友好的唯一标记分配给该元素。代码的简化版本如下所示:
var tagList = [ /* set of dictionary words to cycle through */ ];
function generateTag(id) {
return db.get('tags').then(function (tagData) {
var tag = '', remainder = tagData.tagCount, quotient;
while (remainder >= tagList.length) {
quotient = Math.floor(remainder / tagList.length);
tag += tagList[quotient - 1];
remainder -= tagList.length * quotient;
}
tag += tagList[remainder];
tag = tag.charAt(0).toLowerCase() + tag.slice(1);
tagData.tagCount++;
tagData.tags[tag] = id;
db.put(tagData);
return tag;
}).catch(function (err) {
console.error(err);
});
}
class Element {
constructor() {
var self = this;
generateTag('element' + Date.now()).then(function (tag) {
self.tag = tag;
});
}
}
当创建元素之间存在延迟时,此逻辑按预期工作。但是,当元素在快速爆发(即 for 循环)中创建时,在第一个元素的 db.put
操作完成之前调用第二个、第三个和连续元素的 db.get
调用,导致 "Document update conflict" 连续元素的消息。起初我以为 PouchDB 的冲突解决会自动为我处理这个问题,但我错了。
也许我不明白处理这种情况的正确方法,或者有更好的写法吗?我需要的是连续 db.get
调用有效阻塞,直到上一个操作正在进行的 db.put
完成。我在想,甚至可能对 'tags' 对象上最后一次 PouchDB 操作对应的承诺保留一个静态的 link,这样我就 运行 [=16= 而不是 db.get('tags')
],但我仍然是一个有承诺的新手,不知道这是否是解决这个问题的理想方式,或者这个问题是否是一个真正的问题,或者我没有坚持更好的方法而强加给自己的东西?
更新:
看起来将逻辑修改为始终 return 一个承诺并且始终以 "singleton" 承诺开始而不是 generateTag
函数中的 db.get('tags')
正如我提到的那样确实解决了这个问题,仍然想要了解是否有更好的方法。
对于其他感兴趣的人,这就是我使用更新中提到的 tagPromise
方法重写上述逻辑的方式(如果 PouchDB 专家有更好的答案,我会接受):
var tagList = [ /* set of dictionary words to cycle through */ ];
var tagPromise = db.get('tags');
function generateTag(id, callback) {
tagPromise = tagPromise.then(function() {
return db.get('tags');
}).then(function (tagData) {
var tag = '', remainder = tagData.tagCount, quotient;
while (remainder >= tagList.length) {
quotient = Math.floor(remainder / tagList.length);
tag += tagList[quotient - 1];
remainder -= tagList.length * quotient;
}
tag += tagList[remainder];
tag = tag.charAt(0).toLowerCase() + tag.slice(1);
tagData.tagCount++;
tagData.tags[tag] = id;
callback(tag);
return db.put(tagData);
}).catch(function (err) {
console.error(err);
});
}
class Element {
constructor() {
var self = this;
generateTag('element' + Date.now(), function (tag) {
self.tag = tag;
});
}
}
我发现很难理解您想要实现的目标。您可以 post 标签文档以及元素和标签的示例吗?
乍一看,获取和更新单个 'tags' 文档看起来很臭,我认为使用视图会更有意义。但是为了获得明智的答复,我需要更多详细信息!谢谢!
我有一个存储在 PouchDB 中的 getting/updating 状态方法。此方法由元素的构造函数调用,以将用户友好的唯一标记分配给该元素。代码的简化版本如下所示:
var tagList = [ /* set of dictionary words to cycle through */ ];
function generateTag(id) {
return db.get('tags').then(function (tagData) {
var tag = '', remainder = tagData.tagCount, quotient;
while (remainder >= tagList.length) {
quotient = Math.floor(remainder / tagList.length);
tag += tagList[quotient - 1];
remainder -= tagList.length * quotient;
}
tag += tagList[remainder];
tag = tag.charAt(0).toLowerCase() + tag.slice(1);
tagData.tagCount++;
tagData.tags[tag] = id;
db.put(tagData);
return tag;
}).catch(function (err) {
console.error(err);
});
}
class Element {
constructor() {
var self = this;
generateTag('element' + Date.now()).then(function (tag) {
self.tag = tag;
});
}
}
当创建元素之间存在延迟时,此逻辑按预期工作。但是,当元素在快速爆发(即 for 循环)中创建时,在第一个元素的 db.put
操作完成之前调用第二个、第三个和连续元素的 db.get
调用,导致 "Document update conflict" 连续元素的消息。起初我以为 PouchDB 的冲突解决会自动为我处理这个问题,但我错了。
也许我不明白处理这种情况的正确方法,或者有更好的写法吗?我需要的是连续 db.get
调用有效阻塞,直到上一个操作正在进行的 db.put
完成。我在想,甚至可能对 'tags' 对象上最后一次 PouchDB 操作对应的承诺保留一个静态的 link,这样我就 运行 [=16= 而不是 db.get('tags')
],但我仍然是一个有承诺的新手,不知道这是否是解决这个问题的理想方式,或者这个问题是否是一个真正的问题,或者我没有坚持更好的方法而强加给自己的东西?
更新:
看起来将逻辑修改为始终 return 一个承诺并且始终以 "singleton" 承诺开始而不是 generateTag
函数中的 db.get('tags')
正如我提到的那样确实解决了这个问题,仍然想要了解是否有更好的方法。
对于其他感兴趣的人,这就是我使用更新中提到的 tagPromise
方法重写上述逻辑的方式(如果 PouchDB 专家有更好的答案,我会接受):
var tagList = [ /* set of dictionary words to cycle through */ ];
var tagPromise = db.get('tags');
function generateTag(id, callback) {
tagPromise = tagPromise.then(function() {
return db.get('tags');
}).then(function (tagData) {
var tag = '', remainder = tagData.tagCount, quotient;
while (remainder >= tagList.length) {
quotient = Math.floor(remainder / tagList.length);
tag += tagList[quotient - 1];
remainder -= tagList.length * quotient;
}
tag += tagList[remainder];
tag = tag.charAt(0).toLowerCase() + tag.slice(1);
tagData.tagCount++;
tagData.tags[tag] = id;
callback(tag);
return db.put(tagData);
}).catch(function (err) {
console.error(err);
});
}
class Element {
constructor() {
var self = this;
generateTag('element' + Date.now(), function (tag) {
self.tag = tag;
});
}
}
我发现很难理解您想要实现的目标。您可以 post 标签文档以及元素和标签的示例吗?
乍一看,获取和更新单个 'tags' 文档看起来很臭,我认为使用视图会更有意义。但是为了获得明智的答复,我需要更多详细信息!谢谢!