NodeJS变量外部函数范围

时间:2015-08-08 23:30:42

标签: javascript node.js

对于我的生活,我无法解决这个问题。环顾四周,尝试了许多不同的尝试方法。目前有以下代码。

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的异步调用,并且在显示结果之前没有及时填充结果。我该如何解决这个问题?

1 个答案:

答案 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