33

Meteor.methods()Meteor を使用して、 UI の即時更新を維持しながらサーバー側を使用するタイミングを理解しようとしています。

Andrew Scala の入門チュートリアルMeteor.methods()から、データベース ドキュメントを更新および変更するときに使用する必要があると彼は主張しています。

データの変更や更新などの危険なことを行うすべての関数をサーバー上で定義し、クライアントにそれらの関数を呼び出して、通常の関数のように戻り値を取得させるという考え方です。クライアントは実装を見ることはなく、データを個人的に変更することもありません。サーバーがすべての作業を行います。

このアドバイスに従って、これをコードに実装しました。

サーバ側:

Meteor.methods({

  addMovie: function(data) {
    var movie = Movies.insert({name: data});
    return movie;
  },

  ...

クライアント側:

Template.movies.events = ({

  'click #add-movie': function(e) {

    var name = document.getElementById('movie-name').value;
    Meteor.call('addMovie', name);

    return false;

  }, 

  ...

これは機能しますが、遅いです。Movies.insert()クライアント側で呼び出した場合のように、UI はすぐには更新されません。ドキュメントは、問題を修正するために、クライアント側でスタブを作成できることを示しています。

クライアントでメソッドを呼び出すと、同じ名前のサーバー メソッドに関連付けられたスタブ関数が定義されます。メソッドのスタブを定義したくない場合は、定義する必要はありません。その場合、メソッド呼び出しは他のシステムのリモート プロシージャ コールと同じであり、サーバーからの結果を待つ必要があります。

しかし、これらのスタブはどのように見えるべきでしょうか? 基本的にサーバー側の方法と同じに見えるでしょうか? もしそうなら、ポイントは何ですか?Meteor.methods()の使用と目的、スタブのポイント/使用、およびそれらの実装のより包括的な説明を探しています。

編集: David Greenspan は、 meteor-talkでの Meteor.methods() とスタブの使用を明確にするのに役立ちました。

4

4 に答える 4

19

これが別の例です。

ビンゴ ゲームを書いていて、ボタンをクリックして "house!" を呼び出すとします。クリック イベントでは、メソッドを呼び出すことができます。

Method.call("callHouse");

これにより、サーバー メソッドが呼び出されます。

// on the server
Meteor.methods({
  callHouse: function () {
    if (currentGame.isInProgress) {
      currentGame.winner = this.userId;
      currentGame.end();
    }
  }
});

あなたが最初に「house」を呼び出した場合、メソッドはあなたを勝者としてマークします..ただし、メソッドが非常に遅く、クライアントアプリが待機していると仮定しましょう..サーバーがあなたを確認することを 99% 確信しています.勝者 - 待機せずにユーザーの画面を更新するだけです..この場合、クライアント側のスタブを実装します。

// on the client
Meteor.methods({
  callHouse: function () {
    currentGame.winner = Meteor.userId();
    // add any other side-effects you expect to occur here
  }
});

サーバーの結果が返されたときに、返されたデータがスタブで設定したものと異なる場合は、それが修正され、それに応じて画面が更新されます。

于 2012-10-30T18:27:36.140 に答える
12

要するに :

サーバーにプッシュされたファイルで、サーバー上で実際の作業を行ういくつかのメソッド (Meteor.methods) を定義し、クライアントにプッシュされたファイルでいくつかのメソッド (Meteor.methods) を定義して、クライアントで「即時」の動作を取得します (サーバーが結果の変更をクライアントにプッシュするまで

デビッドの元の投稿は次のとおりです。

こんにちは、ベン、

原則として、メソッドはクライアントとサーバーでまったく異なるアクションを実行できます。たとえば、クライアントで読み込みインジケーターを表示し、サーバーでリモート API と通信します。クライアントで Meteor.methods を呼び出すとクライアントの動作が定義され、サーバーで Meteor.methods を呼び出すとサーバーの動作が定義されます。

データベースで動作するメソッドの場合、多くの場合、同じ実装で両方に対応できます。クライアント バージョンはクライアント側のデータベース (購読しているドキュメントのブラウザ側の "キャッシュ") に影響し、サーバー側のバージョンは実際のデータベースに影響します。クライアントが応答すると、サーバー側のミューテーションの結果に「スナップ」します。クライアント側のデータベースの変更は破棄されます (考え方によっては元に戻されます)。クライアント側のメソッドが他のメソッドを呼び出す場合、これらの 2 次呼び出しはサーバーにリモート送信されません。サーバー側のバージョンは、サーバー上で同じメソッドを呼び出すか、または呼び出さないかのいずれかになります。

したがって、提供するクライアント側のメソッド impl は単なる「シミュレーション」であり、正確である必要はありません (正確である必要はありません)。サーバーの実装と同じであるため、通常はシミュレーションの実装を無料で入手できることを願っています。

これはあなたの質問に答えていますか?

-- デビッド

于 2012-10-25T04:19:41.627 に答える