我正在使用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'}
答案 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;
});