我在服务器端有一个简单的验证方法,它返回true或false。我想从客户端调用它来验证输入并避免在客户端暴露太多逻辑。
原来我有这个。但它从未奏效,result
的价值始终为undefined
。
//methods.js
Meteor.methods({
validate(input) {
return GuestList.find({invitationCode: input}).count() == 1;
}
}
//component.jsx
component = React.createClass({
getInitialState() {
return {
valid: false,
data: null
}
},
handleLoginSubmit(input){
var result = Meteor.call('validateInviteCode', input);
this.setState({ valid: result });
},
render(){
return this.state.valid ? <MyApp data={this.state.data}/> : <Login callbackToContainer={this.handleLoginSubmit} />;
}
});
然后我尝试了以下内容。在调试中,如果我在return res
行上放置了一个断点,我可以看到几秒后它会返回来自服务器的值,但是它也是undefined
。
handleLoginSubmit(input){
var result = Meteor.call('validate', input, function(err, res) {
if(err) {
console.log(err);
}
else {
return res;
}
});
this.setState({ valid: result });
},
我知道这一切都归结为异步vs同步函数调用。在这种情况下,我真的只希望客户端行为同步。我看到一些类似的帖子,人们建议使用期货。但我不确定是否应该将它们放在服务器方法或客户端上。
答案 0 :(得分:1)
您确认这是一个异步问题。在客户端,您没有可用的期货,因此Meteor.call()的结果将始终未定义(http://docs.meteor.com/#/full/meteor_call):
在客户端上,如果你没有传递回调并且你不在存根中,则调用将返回undefined,并且你将无法获得该方法的返回值。这是因为客户端没有光纤,因此实际上没有任何方法可以阻止远程执行方法。
你能用这种方式设置状态吗?
$iEngine = new AutoloadFiles();
$iEngine ->fInclude(__DIR__)
->fInclude(__DIR__.'/classes/')
->fInclude(__DIR__.'/functions/');