NodeJS函数范围外的变量

NodeJS Variable outside function scope

本文关键字:变量 范围 函数 NodeJS      更新时间:2023-09-26

我怎么也解不出来。我四处看了看,尝试了很多不同的方法来做这个。当前有如下代码:

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

你是对的,调用是异步的,所以当console.log(Routers);被处理时,路由器是"没有改变"。一种方法是使用承诺,这要感谢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