2016-04-12 7 views
0

流星群のエラーを管理する際に問題があります。このようなことについて調べて、同期機能に関するいくつかのトピックを見つけましたが、問題を管理できます。私のクライアント側ではメソッドを呼び出すため、前に結果を出す必要があります。 私のクライアント側:流星での同期に関する問題

onSubmit: function(doc){ // Gestion du formulaire d'inscription 
     var error = null; 
     var title = doc.title; 
     var content = doc.content; 

     var formData = { 
      title: title, 
      content: content 
     }; 
     //get the captcha data 
     var captchaData = grecaptcha.getResponse(); 

     Meteor.call('createCPDM', formData, captchaData, function(err){ 
      if(err){ 
       error = new Error("Une erreur s'est produite"); 
      } 
     }); 

     if(error === null){ 
      this.done(); // Appelle onSuccess 
     } 
     else{ 
      this.done(error); // Appelle onError 
     } 

     // reset the captcha 
     grecaptcha.reset(); 
     return false; 
    }, 

私のサーバー側:

createCPDM: function(formData, captchaData) { 
    var ip = "0.0.0.0"; 
    var verifyCaptchaResponse; 

    if (!this.connection.clientAddress) { 
     verifyCaptchaResponse = reCAPTCHA.verifyCaptcha(ip, captchaData); 
    } 
    else { 
     verifyCaptchaResponse = reCAPTCHA.verifyCaptcha(this.connection.clientAddress, captchaData); 
    } 

    if (!verifyCaptchaResponse.success) { 
     throw new Meteor.Error('422', 'reCAPTCHA Failed: ' + verifyCaptchaResponse.error); 
    } 
    else { 
     var CPDMID = CPDM.insert(formData); 
    } 

    return true; 
} 

は、だから私はあなたの助けのために

感謝の...私はエラーを持っている場合、前続ける知っている必要があります!

+0

Javascriptを私は実際にコールバック – Endless

+0

@Endless内部 'Meteor.call'後にすべてをかけるほとんど**非同期**言語であります'this.done()'にアクセスする必要があるのでできません –

+0

'function(err){}'を 'err => {}'に変更してから 'this.done'にアクセスしてください – Endless

答えて

1

ES6

onSubmit: function(doc){ // Gestion du formulaire d'inscription 
    // preventDefault() ???? 
    var formData = { 
     title: doc.title, 
     content: doc.content 
    }; 

    //get the captcha data 
    var captchaData = grecaptcha.getResponse(); 

    Meteor.call('createCPDM', formData, captchaData, err => { 
     if(err) { 
      // Appelle onError 
      return this.done(new Error("Une erreur s'est produite")); 
     } 

     this.done(); // Appelle onSuccess 
     grecaptcha.reset(); 
    }); 
} 

ES5

onSubmit: function(doc){ // Gestion du formulaire d'inscription 
    // preventDefault() ???? 
    var formData = { 
     title: doc.title, 
     content: doc.content 
    }; 

    //get the captcha data 
    var captchaData = grecaptcha.getResponse(); 
    var self = this 

    Meteor.call('createCPDM', formData, captchaData, function(err) { 
     if(err) { 
      // Appelle onError 
      return self.done(new Error("Une erreur s'est produite")); 
     } 

     self.done(); // Appelle onSuccess 
     grecaptcha.reset(); 
    }); 
} 
+0

最初のソリューションES6は私のためには機能しませんが、2番目のソリューションは機能します!ありがとう –

0

Meteor.callは、サーバー側の戻り値を同期して返しません。

Meteorでサーバー側計算の結果を使用する場合、それを行う唯一の方法はコールバック関数です。 documentationを引用:

あなたは最後の引数としてコールバック関数が含まれている場合は、[...] メソッドは非同期に実行されます:それは、特定の に何も返さないだろうと例外をスローしません。メソッドが [...]の場合、エラー と結果の2つの引数を使用してコールバックが呼び出されます。

コールバックがサーバー側の結果を取得するまで、ユーザーの向きの通知(回転ホイールのような)を表示することができます。

+0

あなたの答えをありがとう!私はそのアイデアを理解していて、同じことをしましたが、サーバー側の結果を待つためにクライアント側を "ブロック"する方法がわかりません。 –

+0

JavaSciptでブロックしません。 "this"変数が必要な場合は、 "this"値を保持する矢印関数の構文を使用します。同様のように: 'Meteor.call(" some "、()=> {this.boo();});' – aedm

関連する問題