2016-11-20 14 views
0

を返さない:流星ヘルパーは、私がリターン文字列データのためのヘルパーを作成したいと考えて何も

className() { 

    let className; 

    Meteor.call('getIp', (err, res) => { 

     if (err) { 
     console.log(err); 
     } else { 

     // User ip 
     let ip = res.data.ip; 
     let userLikers = this.likers; 

     // Si l'utilisateur a déjà aimé le post 
     if (userLikers.includes(ip)) { 
      className = 'icon-favorite'; 
     } else { 
      className = 'icon-favorite-border'; 
     } 

     console.log(className); 

     return className; 

     } 
    }); 

    } 

私はconsole.log(classNameは)良いです、そして私のリターンが空である理由を私は理解していません。

誰でも知っていますか?

ありがとうございました!

答えて

0

Meteor.call()は、クライアント側で非同期に実行されます。すべての非同期関数と同様に、それらはコールバック関数を使用します。あなたの場合、それはコードの(err, res) => { ... }部分です。

これは、がコールバック関数の戻り値であることを意味します。ただし、Meteor.call()呼び出しの前または後のコードは別のスコープを使用します。したがって、基本的にclassname()関数は、その関数のreturn文がないため何も返しません。

コールバック呼び出しの前に宣言された別の変数に、コールバック内のデータを割り当てることをお勧めします。例えば。何かのように

//Just for illustration. 
//Do NOT use it, as it will not work an will not do what you might think it does. 
className() { 

    let value; 

    Meteor.call('getIp', (err, res) => { 
     //do other stuff like error handling 
     // and getting the value here ... 

     console.log(className); 
     value = className; 
    }); 

    return value; 
} 

しかし、まだ非同期性を説明しません。コールバックが起動する前に関数が返る可能性が非常に高いかもしれません。その場合でも空の戻り値が得られます。これを避けるにはMeteor.wrapAsync()を使用して、Meteor.call()をその内部にラップしてみてください。これにより、非同期関数呼び出しの戻り値を取得できます。

+0

このコードが実行される可能性の高いクライアントでは、非同期ラップは機能しません。私は、無効なデータソースを持っていることを除いて、Blazeヘルパーで非同期コードを使用するエレガントな方法を認識していません。コールはそれらのソースの1つではありません。 – MasterAM

+0

クライアントで非同期ラップが機能しません。しかし、どのように私のデータをチェックできますか? –

+0

あなたは基本的な問題について説明していますが、それは良いですが、私は信頼できるように動作しないコードを投稿することをお勧めしません。それは問題の解決策ではありません。 – Mikkel

0

ここで覚えておくべきことは、サーバーとクライアントが、サーバーとクライアントの異なる場所で動作することです。流星は、この違いをあまり明確にしておらず、データの受け渡しをほぼシームレスにしています。

私が使用する手法は、結果をmongoコレクションに挿入するサーバーメソッドを取得することです。クライアント上のヘルパーは自動的に実行され、クライアントは到着時にそれを表示することができます。

0

他の回答が指摘したように、メーターメソッド(または他の非同期コード)をヘルパー関数(レンダリング中)で使用することは機能しません。ヘルパーはブロックできないため、サーバーからの結果を待つことはできません。

あなたがしようとしていることを見ても、おそらくより良い解決策があります。あなたのクライアントコードは、(クライアントの)IPアドレスが何であるかをServerに問い合わせているので、適切なCSSクラスを選択することができます。

Meteorの優れたアカウントパッケージを見てみることをお勧めします。これはとても使いやすく、ユーザーを特定する強力な方法を提供します。

ユーザーにサインインを要求せずにこのパーソナライゼーションを提供したい場合は、クライアントに永続ID(つまり、randomモジュールで生成、localStorageにストアするか、persistent-sessionなどで生成) 、または単にこのユーザが好きなアイテム(投稿)のリストをクライアントに格納することができます。

これにより、ユーザーが静的IPアドレスを持っていない限り、これらが頻繁に変更されることもありません。

0

セッションを使用して試すことができます。テンプレートがロードされているときは、メソッドを呼び出し、コールバックで戻り値をセッションに割り当てます。ヘルパーでは、最初のセッションは定義されていないが、コールバックで設定されている場合、ヘルパーは自動的に再実行され、セッションは有効な値を返すため、有効なデータを返すためにそのセッションを使用できます。

関連する問題