2016-04-07 8 views
1

現在、Angular and Meteorで電子メールでユーザーを検索しようとしています。クライアント側のコードではAccounts.findUserByEmail()を使用しています。 クライアントでは、私はMeteor.call()を非同期で呼び出しています。問題はconsole.log()またはalert()しか返すことができないが、例えばreturn trueまたはreturn falseのように値を返すことができないということです。私のクライアントが読むことはありませんか?私のクライアント上のどこかに続いてMeteor.call()からAccounts.findUserByEmail(email)にbooleanを返す方法

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を使用しています

$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; 
      } 
     }) 
    } 

私入力フォームにメールを入力してください。有効なメールアドレスを入力すると、console.log値が表示されますが、returnの値は読み取れません。 私は$scope.doesUserEmailExist(email) === trueを使うことができると思っていましたが、成功したことはありませんでした。

答えて

0

機能

function(judge){ 

は機能

function(err, res){ 

が実行された時点で終了しています。それはコールバックです。あなたはコールバックを呼び出すことに虚偽と真実を返しています....元の関数ではありません。

更新が必要なものを更新する関数を呼び出すことができます。または、何らかの種類の反応変数を更新してください(より多くの火災/反応をするような角度ではわかりません)

+0

.log(judge.email + 'は登録された電子メールとして存在します!')だから私はなぜ私は戻り値を取得していないのだろうかと思っていた。 – Felice

+0

はい、いつでもコンソールに印刷することができます.....また、いつでもアラートを行うことができます。何が起きているのかを知りたい場合は、doesUserEmailExist関数の最後にconsole.log( "end of doesUserEmailExist")を入れてください。 –

+0

あなたは関数の終了を見てから、コールバックは –

3

これはわかりませんが、Meteor.callがサーバーに非同期要求をしていると思います

$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関数は約束を返却するために、これを試して

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

があなたのコントローラへの依存として$ qをサービスを追加することを忘れないでください。

Angular.$q

+0

と呼ばれ、 'res'instead 'resolve()'に 'true'や' false'を指定したり、コールバック関数で 'response'としてアクセスしたいものを指定します。 –

0

だから私はこの問題を考え出しました。

Meteor.call()は、サーバから実行されているMeteorのAccounts.findUserByEmail()にバインドされているcheckUserByEmailにメソッドを呼び出します。 クライアントにサーバーコールを実行するとconsole.logに値が返され、クライアントにはファイバーがないために値が返されません。

解決策は、Session変数を作成して値をバインドし、その値をクライアントに返すことです。解決策は以下のようになります:その後、

$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)); 
    } 

Session.get(variable)

例を使用してWebコンソールでのセッション変数を返す:まあ、私はコンソールを取得していますconsole.log(Session.get('[email protected]`)) //true

*これが唯一の流星に適用されます*

関連する問題