【问题标题】:NodeJS Variable outside function scope函数范围之外的NodeJS变量
【发布时间】:2015-08-08 23:30:41
【问题描述】:

为了我的一生,我无法解决这个问题。环顾四周并尝试了许多不同的方法来尝试实现这一目标。目前有以下代码。

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

【问题讨论】:

  • 将其他代码放入exists()回调中
  • 但是如果我把 console.log(res) 代替 Routers = JSON.stringify(res) 它可以工作并输出到控制台,而不是把它推到变量中

标签: javascript node.js


【解决方案1】:

你是对的,调用是异步的,所以当console.log(Routers); 被处理时,路由器是“没有改变”。 由于Q npm 模块,一种方法是使用 Promise:

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

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多