NodeJS需要范围变量

时间:2017-01-01 18:16:29

标签: javascript node.js

我有一个这样的模块。

somemodule.js

module.exports = {
  val: null,
  get: function() {
     finddata('/', function(resp) {
       this.val = resp
     }
  }
}

并且被称为:

var x = require('somemodule');
x.get();
x.get();

第一次调用后,此x.val未设置。试过这个也行不通:

module.exports = {
  val: null,
  get: function() {
     var that = this;
     finddata('/', function(resp) {
       that.val = resp
     }
  }
}

如何设置x.val?

2 个答案:

答案 0 :(得分:2)

你的finddata是异步运行的,它会被调用并立即返回以继续下一行执行。那一刻它不确定回调是否被执行。执行回调后,将仅设置值。要确保设置值,然后在获取值之后,您可以使用promises。

我刚刚拿了两个样本文件a.js和b.js来解释它是如何工作的

<强> a.js

var x = require('./a');
 x.get().then(function(){
       console.log(x.val)
 });

<强> b.js

Lets wait for some time

10

<强>输出

+ (void)setTitle:(NSString *)title forViewController:(UIViewController *)viewController {
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
    [label setTextAlignment:NSTextAlignmentCenter];
    [label setTextColor:[UIColor whiteColor]];
    [label setFont:[UIFont boldSystemFontOfSize:18]];
    [label setText:title];
    [label sizeToFit];

    viewController.navigationItem.titleView = label;
}

答案 1 :(得分:2)

首先,问题不在于需要什么,而是与范围无关。实际发生的是,正如其他人已经说过的那样,finddata是异步函数意味着您不知道将来何时将调用回调function (resp) {...}以及何时val成为某种东西null以外的人。要解决此问题,您需要将额外的回调传递给get函数,或者从get函数返回承诺。更清洁的方法是从get函数返回Promise。

x.get()
.then(() => {
  // val is ready
})

x.get(() => {
  // val is ready
})

你遇到的另一个问题是你没有考虑如果finddata调用你的回调并出现错误会怎样?有类似的东西:

finddata('/', function(resp){
  that.val = resp
}

真的是你不想拥有的东西。使用您拥有的代码,如果finddata使用error调用您的回调,val将等于该错误,否则它将等于null,如果{{如果没有错误,1}}符合节点最佳做法以使用finddata调用回调,例如null

除此之外你还想做什么?是否需要使用cb(null, data)事件来暴露模块? {app}定期调用val函数吗?如果是这样,为什么要引入新模块,只需调用get,我自己就是模块。