PouchDB的高频更新(文档更新冲突)

时间:2017-01-19 06:32:01

标签: javascript promise pouchdb

我有一种获取/更新存储在PouchDB中的状态的方法。此方法由元素的构造函数调用,以便为元素分配用户友好的唯一标记。代码的简化版本如下所示:

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.get操作完成之前调用第{2}和第3个连续元素的db.put调用,从而产生“Document”更新冲突“连续元素的消息。起初我以为PouchDB的冲突解决方案会自动为我处理,但我错了。

也许我不理解处理此类案件的正确方法,还是有更好的方式来写这个?我需要的是连续的db.get调用有效阻塞,直到前一个操作的正在进行的db.put结束。我想甚至可能保留一个静态链接到与'tags'对象上的最后一个PouchDB操作相对应的promise,这样我就不会db.get('tags')运行tagsPromise.then(function () { return db.get('tags'); }),但我还是一个新手承诺并且不知道这是否是解决这个问题的理想方式,或者这个问题是否是一个真正的问题,或者是我通过不坚持更好的方法强加给自己的东西?

更新 看起来修改逻辑总是返回一个承诺,总是以db.get('tags')函数中的“{single}”承诺而不是generateTag开头,正如我提到的那样修复问题,仍然想知道是否存在更好的方法。

2 个答案:

答案 0 :(得分:0)

对于其他感兴趣的人,这就是我使用我在更新中提到的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;
        });
    }
}

答案 1 :(得分:0)

我发现很难理解你想要实现的目标。您可以发布标签文档以及元素和标签的示例吗?

乍一看,获取和更新单个“标签”文档看起来很臭,我认为使用视图会更有意义。但是为了获得明智的回应,我需要更多细节!谢谢!