从客户端调用服务器端方法返回undefined

时间:2016-02-07 02:56:24

标签: meteor reactjs

我在服务器端有一个简单的验证方法,它返回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同步函数调用。在这种情况下,我真的只希望客户端行为同步。我看到一些类似的帖子,人们建议使用期货。但我不确定是否应该将它们放在服务器方法或客户端上。

1 个答案:

答案 0 :(得分:1)

您确认这是一个异步问题。在客户端,您没有可用的期货,因此Meteor.call()的结果将始终未定义(http://docs.meteor.com/#/full/meteor_call):

  

在客户端上,如果你没有传递回调并且你不在存根中,则调用将返回undefined,并且你将无法获得该方法的返回值。这是因为客户端没有光纤,因此实际上没有任何方法可以阻止远程执行方法。

你能用这种方式设置状态吗?

$iEngine    =   new AutoloadFiles();
$iEngine    ->fInclude(__DIR__)
            ->fInclude(__DIR__.'/classes/')
            ->fInclude(__DIR__.'/functions/');