如何将Meteor.call()中的布尔值返回到Accounts.findUserByEmail(email)

时间:2016-04-07 03:46:22

标签: angularjs meteor meteor-accounts angular-meteor

我目前正在尝试通过Angular和Meteor中的电子邮件以及我使用Accounts.findUserByEmail()的客户端代码查找用户。 在客户端上,我使用Meteor.call()异步调用它。问题是我只能将console.log()或alert()返回给值,但我不能举例如return truereturn false。它不是我的客户阅读的?

以下是我的服务器端方法的预览:

checkUserByEmail : function (email) {

    this.unblock();

    check(email, Match.Any);
    console.log('Checking to see if ', email, 'is registered')
    var userEmail = Accounts.findUserByEmail(email);
    if(userEmail){
      console.log(userEmail + ' Email account is registered')
      return true
    }
    else{
      console.log(userEmail + ' Email account is not registered' )
      return false
    }
    return userEmail;
  }

然后在我的客户的某个地方:

    $scope.doesUserEmailExist = function(judge){
        Meteor.call('checkUserByEmail', judge.email , function(err, res){
            if(res){
                console.log(judge.email  + ' exists as a registered email!');
                alert('Judge is Valid')
                return true;
            }
            else if(err){
                console.log('Error ',judge.email , 'does not exist!');
                return false;
            }
        })
  }

我正在使用$ scope.doesUserEmailExist通过在输入表单中输入电子邮件来查看用户是否已注册到我的应用程序。当我输入有效的电子邮件地址时,我得到一个console.log值,但我无法读取任何return值? 我希望我可以使用$scope.doesUserEmailExist(email) === true,但我没有成功运行它。

3 个答案:

答案 0 :(得分:3)

我不知道这个Metor但我想Meteor.call正在向服务器发出异步请求,我认为你需要做$scope.doesUserEmailExist函数返回一个promise,试试这个:

$scope.doesUserEmailExist = function(judge){
    var deferred = $q.defer();
    Meteor.call('checkUserByEmail', judge.email , function(err, res){
        if(res){
            console.log(judge.email  + ' exists as a registered email!');
            alert('Judge is Valid')
            deferred.resolve(true);
        }
        else if(err){
            console.log('Error ',judge.email , 'does not exist!');
            deferred.resolve(false);
        }
    })
    return deferred.promise;
}

看看是否属实:

$scope.doesUserEmailExist(email).then(function(response){
    response === true
})

不要忘记添加$ q服务作为对控制器的依赖。

Angular.$q

答案 1 :(得分:0)

功能

function(judge){

将在函数

之前完成
function(err, res){

已执行。那是一个回电。你对调用回调的事物返回false和true,而不是原始函数。

您可以调用更新任何需要更新的函数。或者更新某种反应变量(不太确定角度,因为我做更多的火焰/反应)

答案 2 :(得分:0)

所以我想出了问题所在。

Meteor.call()将方法调用checkUserByEmail,该Accounts.findUserByEmail()绑定到从服务器运行的Meteor $scope.doesUserEmailExist = function(judge){ var exist = Meteor.call('checkUserByEmail', judge.email , function(err, res){ if(err){ console.log(err + ' ' + judge.email , 'does not exist!'); Session.set(judge.email, false); } if(res){ console.log(res + ' ' + judge.email + ' exists as a registered email!'); Session.set(judge.email, res); } return Session.get(judge.email) }) exist; console.log('Session is ' + Session.get(judge.email)); } 。 对客户端的服务器调用只能是console.log一个值而不返回值,因为客户端没有光纤。

因此解决方案是创建一个Session变量并将值绑定到它并在客户端上返回该值。解决方案如下:

Session.get(variable)

然后使用console.log(Session.get('johnsmith@mayflower.com`)) //true

在Web控制台中返回Session变量

示例: 1. "Kyiv CityHoll" | "Microsoft" | $130 | 2016.12.02 2. "Odessa CityHoll" | "Microsoft" | $100 | 2016.12.02 3. "Kyiv CityHoll" | "Google" | $1000 | 2016.12.02 4. ...

*这仅适用于Meteor *