对于我的生活,我无法解决这个问题。环顾四周,尝试了许多不同的尝试方法。目前有以下代码。
var config = require("./config.js");
var cradle = require('cradle')
var MikroNode = require('mikronode');
var WebServer = require('./bin/www');
var Routers = "Hasnt changed";
var conndb = new(cradle.Connection)(config.couchdb.host);
var db = conndb.database(config.couchdb.db);
db.exists(function(err, exists){
if (err) { console.log('error', err);}
else if (exists) { console.log('Seems the Force is with you - Database Exists');}
else { db.create(); }
});
db.temporaryView({
map: function (doc){
if (doc.type=='ConfigRouter') emit(doc.name, doc);
}
}, function (err, res){
Routers = JSON.stringify(res);
}
);
console.log(Routers);
目前它将回复:
E:\Dev\MM>npm start
> MM@0.0.1 start E:\Dev\MM
> node ./Start.js
Hasnt changed
Seems the Force is with you - Database Exists
我假设它是对CouchDB的异步调用,并且在显示结果之前没有及时填充结果。我该如何解决这个问题?
答案 0 :(得分:0)
你是对的,这个调用是异步的,所以当处理console.log(Routers);
时,路由器是“没有改变”。
一种方法是使用promises,这要归功于Q npm模块:
var Q = require('q');
var deferred = Q.defer();
db.temporaryView({
map: function (doc) {
if (doc.type=='ConfigRouter') emit(doc.name, doc);
}
}, function (err, res) {
deferred.resolve(JSON.stringify(res));
});
deferred.promise
.then(function (data) {
Routers = data;
console.log(Routers);
// do some stuff...
})
.done();
也许可以在不使用Q.defer
并直接调整回调的情况下做更好的事情:
https://github.com/kriskowal/q#adapting-node