即使使用正确的._rev,PouchDB也会在.put()中出现409“文档更新冲突”错误

时间:2016-02-12 06:42:07

标签: javascript pouchdb

我有一个可以在PouchDB中创建或更新文档的函数,如下所示。第一次运行时,该功能完美运行。但是,即使._rev属性看起来正确,每次后续运行都会产生409错误。

function saveEventMatchesToDatabase(event, db) {
    /* event: An event object from The Blue Alliance API. */
    /* db: a reference ot the PouchDB database. */

    /* Purpose: Given an event, extract the list of matches and teams, and save them to the database. */
    TBA.event.matches(event.key, function(matches_list) {
        var i = 0;
        for (i = 0; i < matches_list.length; i++) {
            var match = new Object();
            var docrec = new Object();

            match._id = 'matches/' + matches_list[i].key;
            match.redTeam = matches_list[i].alliances.red.teams;
            match.blueTeam = matches_list[i].alliances.blue.teams;

            /* If the doc already exists, we need to add the _rev to update the existing doc. */
            db.get(match._id).then(function(doc) {
                match._rev = doc._rev;
                docrec = doc;
            }).catch(function(err) {
                if ( err.status != 404 ) {
                    /* Ignore 404 errors: we expect them, if the doc is new. */
                    console.log(err);
                }
            });

            db.put(match).then(function() {
                // Success!
            }).catch(function(err) {
                console.log('\ndoc._rev: ' + docrec._rev);
                console.log('match._rev: ' + match._rev);
                console.log(err);
            });
        }
    });
}

第二次运行此函数的示例控制台输出如下。 match_list中的每个项目都会出现相同的错误,而不仅是间歇性的错误。

doc._rev: 1-7cfa2c6245dd939d8489159d8ca674d9
match._rev: 1-7cfa2c6245dd939d8489159d8ca674d9
r {status: 409, name: "conflict", message: "Document update conflict", error: true}

我不确定我错过了什么,这导致了这个问题。任何关于下一步的建议都将不胜感激。

1 个答案:

答案 0 :(得分:4)

第一个问题似乎是你在循环中使用了一个函数,这意味着内部函数内部使用的任何变量都会在你的脚下随机变化,具体取决于调用函数的时间。您可以使用forEach()

代替for循环

然而,第二个问题是你没有正确使用承诺;在执行get()之前,您需要等待put()的结果。所以forEach()可能首先不是你想要的;你可能想用Promise.all()然后撰写你的承诺。

我在这一段时间写了一篇文章;很多人告诉我它值得一读,即使它很长:"We have a problem with promises."阅读它,你应该希望在它结束时理解承诺。 :)