最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用nano

运维笔记admin15浏览0评论

使用nano

使用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'}
回答如下:

根据documentation你使用纳米承诺错误。您可以使用它来创建一个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;
});

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论