2017-08-10 10 views
0

Meteor.call()関数を使用してクライアントサイドコードからサーバーメソッドを呼び出しています。クライアントのMeteor.callメソッドから結果を返す方法は?

しかしコールバック関数の戻り値onCreated関数内のvarに渡そうとすると、定義されていない値が返されます。それは方法があることを説明し、非同期であることを説明流星は、呼び出しのために、私はドキュメントを読んだときも

https://stackoverflow.com/a/31661065/1829251

:結果はまだコールバックの範囲内でのみ使用可能です。この溶液を見てみると

関数の戻り値を変数に割り当てることはできません。

https://docs.meteor.com/api/methods.html#Meteor-call

質問:

Meteor.callメソッドの結果をクライアントでどのように返すことができますか?クライアント側のコードの

コードスニペット:

import { Template } from 'meteor/templating'; 
import { Meteor } from 'meteor/meteor'; 
import { Datasets } from '../../../../api/datasets/datasets.js'; 
import { Constants } from '../../../../startup/constants.js'; 


import './rollup-history.html'; 
import './rollup-history.scss'; 

Template.rollup_history.onCreated(function() { 


    this.historyDays = 7; 


    this.rollupHistoryMECTitles =() => { 

    let mecObjects = []; 

    // Query the MEC calendar dates from AppConfiguration collection 
    let method = Constants.Methods.getAppConfigCollectionFromKeyDateSorted; 
    mecObjects = Meteor.call(method, Constants.AppConfigKeys.meccalendarInitialValues, this.historyDays, (error, result) => { 
      if(error){ 
      console.log("Error retrieving MEC Dates" + error); 
      } 

      //Logging values here shows the values as expected 
      console.log("MEC Dates in View" + JSON.stringify(result)); 
      return result; 
     } 
    ); 

    //logging value here shows undefined value 
    console.log("mec objects: " + JSON.stringify(mecObjects)); 

    return mecObjects; 


    }; 


}); 

Template.rollup_history.helpers({ 



    mecHeaderColumns: function() { 

    return Template.instance().rollupHistoryMECTitles(); 
    }, 

}); 
+0

でより多くを参照してください。その変数を 'Meteor.call'の関数の中に' Template.instance()。x.set(result) 'として割り当てます。 –

+0

実際に何をしようとしていますか? onCreated()から値を返すことはあなたにとってどういう意味ですか?メソッド呼び出しがなくても、それは私には意味がありません。 – zim

答えて

1

return文がコールバックにあり、ブロックされていないため、そのようなメソッド値を返すことはできません。あなたは値を返すhttps://github.com/stubailo/meteor-reactive-methodを置くことができますが、それはヘルパーや反応環境の中で生きなければなりません。

1

Meteor.call関数は何も返されませんのでごmecObjectsの値は常に、undefinedになります。サーバーのメソッド呼び出しの応答(またはエラー)は、実際にはコードのようにコールバックにのみ渡されます(errorresult変数)。

0

短い答え:

は、共通のコード内であなたのMeteor.Methodを定義する(サーバとクライアントが利用可能なコード)をオプションでMeteor.applyを使用{ returnStubValue : true }

mecObjects = Meteor.apply(method, [Constants.AppConfigKeys.meccalendarInitialValues, this.historyDays], { returnStubValue: true }, (error, result) => { 
     if(error){ 
     console.log("Error retrieving MEC Dates" + error); 
     } 

     //Logging values here shows the values as expected 
     console.log("MEC Dates in View" + JSON.stringify(result)); 
     return result; 
    } 
); 

console.log(mecObjects) //prints the client-side result of the meteor method 

長い答え:

流星ができますブラウザ上のサーバーメソッドをシミュレートしているOptimistic-UI用です。これを有効にするには、Meteor.Methodを共通コード(サーバー+クライアントスペース)で定義します。これは、サーバーラウンドトリップを行う必要がないため、ユーザーがUIの更新を高速に表示できるので便利です。 meteor method flow

上記の図では、メソッド呼び出しはクライアントで最初に実行され、後でサーバーで実行されることに注意してください。 { returnStubValue: true }クライアントの実行

からメソッドの戻り値を受け取るために、発信者を可能流星メソッドを書くとき、あなたがクライアントまたはサーバー上で排他的に実行されますどのようなロジックを指定するthis.isSimulationを使用することができます。このチェックの外にあるコードはの両方でで実行されます。

meteor method example

唯一のブラウザはconsole.log("hi i'm client")を実行しながら、その上の写真では、サーバが唯一console.log("hi i'm server")を実行することに注意してください。両方とも、isSimulationチェックの外でコードを実行します。

いくつかの懸念:

  1. サーバーの戻り値は、クライアントの戻り値と異なる場合はどう?

    result!= mecObjectsこのような状況を適切に処理する必要があります。

  2. クライアントの実行に失敗した場合はどうなりますか?サーバーはまだ動作していますか?

    はい、サーバーは引き続き実行されます。ただし、別のオプション、throwStubExceptions: trueを追加することで、クライアント のサーバーの実行を防ぐことができます。このオプションは、 がtry catchで取得できるクライアント例外をスローします。

  3. クライアントとサーバーのmongoの更新が異なる場合はどうなりますか?

    サーバーのモンゴーの変更により、クライアントのモンゴーの変更がオーバーライドされます。

は、テンプレートの反応VARを作成してみてください https://guide.meteor.com/methods.htmlとむしろhttps://forums.meteor.com/t/how-to-return-value-on-meteor-call-in-client/1277/2

関連する問題