使用nano-promises强制同步CouchDB查询和更新

时间:2017-12-21 15:17:32

标签: javascript node.js promise couchdb couchdb-nano

我正在使用nano-promise尝试强制node.js中的以下代码串行运行。但是,在第一个CouchDB插入完成之前,以下承诺似乎仍然完成。这会导致一个问题,因为以后的promises会有代码来查询CouchDB并期望前一步骤中的代码完成。我认为问题是因为在db.get之后和db.get完成之前立即执行return。有没有人对如何解决这个问题有任何建议?

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);
});

此代码的输出为:

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)

输出应为:

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

1 个答案:

答案 0 :(得分:0)

根据documentation你使用nano-promise错误。您可以使用它来创建一个db对象,该对象在insert和get上返回promises。

你似乎有三个嵌套的承诺,代码应该是这样的:

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;
});