2017-12-21 5 views
0

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'} 

Antwort

0

Nach dem documentation Sie verwenden Nano-Versprechen falsch. Sie verwenden es, um ein db-Objekt zu erstellen, das beim Einfügen und Abrufen Versprechungen zurückgibt.

Sie scheinen tripple verschachtelt Versprechen zu haben, sollte der Code wie folgt aussehen:

var db = prom(nano('http://localhost:5984')).db.use('myDB'); 

var promise = Promise.resolve(request) 
.then(function (args) { 
    console.log('step 1'); 
    console.log(args.body); 
    return db.get(args.body.id) 
    .catch(
    err => { 
     var doc_update = body; 
     doc_update.updated = new Date(); 
     return db.insert(doc_update, args.body.id) 
     .then(x=>args); 
    } 
) 
    .then(
    body => { 
     var doc_update = body; 
     doc_update.beginDate = args.body.startDate; 
     doc_update.updated = new Date(); 
     return db.insert(doc_update, args.body.id) 
     .then(
     ok => { 
      console.log('Database UPDATED (Step 1)'); 
      return args; 
     }, 
     err => { 
      console.log("Failed UPDATE (Step 1)"); 
     } 
    ); 
    } 
) 
}).then(function (args) { 
    console.log(args.body); 
    return args; 
}); 
Verwandte Themen