Ich verwende nano-promise, um zu erzwingen, dass der folgende Code in node.js in Serie ausgeführt wird. Die folgenden Versprechen scheinen jedoch immer noch abgeschlossen zu sein, bevor die erste CouchDB-Einfügung abgeschlossen ist. Dies verursacht ein Problem, da spätere Versprechen Code haben, der CouchDB abfragt und erwartet, dass der Code in den vorherigen Schritten vollständig ist. Ich glaube, das Problem besteht darin, dass die Rückgabe unmittelbar nach db.get und vor dem Abschluss von db.get ausgeführt wird. Hat jemand Vorschläge, wie Sie dieses Problem lösen können?Verwenden von Nanoversprechen, um synchrone CouchDB-Abfragen und -aktualisierungen zu erzwingen
var nano = require('nano')('http://localhost:5984');
var Promise = require('nano-promise');
var db = nano.db.use('myDB');
var promise = new Promise(function (resolve, reject) {
resolve(request);
}).then(function (args) {
console.log('step 1');
console.log(args.body);
db.get(args.body.id, function(err, body) {
var doc_update = body;
if (!err) {
doc_update.beginDate = args.body.startDate;
doc_update.updated = new Date();
db.insert(doc_update, args.body.id, function(err, body){
if(!err){
console.log('Database UPDATED (Step 1)');
}
});
} else {
doc_update.updated = new Date();
db.insert(doc_update, args.body.id, function(err, body){
if (err) throw err;
});
}
});
return new Promise.Arguments(args);
}).then(function (args) {
console.log(args.body);
return new Promise.Arguments(args);
});
promise.then(function (args) {
console.log(args.body);
return new Promise.Arguments(args);
});
promise.then(function (args) {
console.log(args.body);
});
Der Ausgang dieses Codes ist:
step 1
{id: '123',
startDate: '2017-12'}
step 2
{id: '123',
startDate: '2017-12'}
step 3
{id: '123',
startDate: '2017-12'}
step 4
{id: '123',
startDate: '2017-12'}
Database UPDATED (Step 1)
Die Ausgabe sollte:
step 1
{id: '123',
startDate: '2017-12'}
Database UPDATED (Step 1)
step 2
{id: '123',
startDate: '2017-12'}
step 3
{id: '123',
startDate: '2017-12'}
step 4
{id: '123',
startDate: '2017-12'}