4

次のエラーメッセージはどういう意味ですか?

フェンスはすでにアクティブになっています-書き込みを追加するには遅すぎます

入手方法の例を次に示します。

環境

プロジェクトの作成

meteor create test
cd test
meteor add coffeescript http
mv test.js test.coffee
meteor

test.coffee

Records = new Meteor.Collection("records")

if Meteor.is_client
    Meteor.startup ->
        Meteor.call "test"

if Meteor.is_server
    Meteor.methods
        test: ->
            Meteor.http.get "http://www.meteor.com", ->
                Records.insert some:"data"
4

2 に答える 2

6

メソッドの実行が完了すると、書き込みを追加することはできません。メソッドの完了を遅らせるには、Futuresを使用できます。このようなもの:

Meteor.methods({
  foo: function() {
    var futures = _.map(urls, function(url) {
      var future = new Future();
      var onComplete = future.resolver();

      Meteor.http.get(url, function(error, result) {
        // do whatever you need

        onComplete();
      });

      return future;
    });

    Future.wait(futures);
  }
});
于 2012-07-16T19:04:56.057 に答える
4

メソッドは、戻る前にすべての書き込みを終了する必要があります。

この例では、最も簡単な方法は、コールバックを省略し、Meteor.http.getの戻り値を使用することです。

if Meteor.is_server
    Meteor.methods
       test: ->
          data = Meteor.http.get "http://www.meteor.com"
          Records.insert some:"data"

舞台裏では、これはavitalが言うようにFuturesを使用しています。複数のコールバックを並行して実行したい場合、またはその他の複雑なことを行う場合は、FuturesAPIを使用できます。ただし、1つのリクエストを行うだけの場合、またはリクエストをすでに順番に並べる必要がある場合は、同期バージョンのMeteor.http.get作品を使用すると、入力が簡単になります。

于 2012-07-21T01:50:32.557 に答える