我有一个可以在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}
我不确定我错过了什么,这导致了这个问题。任何关于下一步的建议都将不胜感激。
答案 0 :(得分:4)
第一个问题似乎是你在循环中使用了一个函数,这意味着内部函数内部使用的任何变量都会在你的脚下随机变化,具体取决于调用函数的时间。您可以使用forEach()
。
然而,第二个问题是你没有正确使用承诺;在执行get()
之前,您需要等待put()
的结果。所以forEach()
可能首先不是你想要的;你可能想用Promise.all()
然后撰写你的承诺。
我在这一段时间写了一篇文章;很多人告诉我它值得一读,即使它很长:"We have a problem with promises."阅读它,你应该希望在它结束时理解承诺。 :)