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' 文档看起来很臭,我认为使用视图会更有意义。但是为了获得明智的答复,我需要更多详细信息!谢谢!