我有一个这样的模块。
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?
答案 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
,我自己就是模块。