4

以下错误信息是什么意思?

栅栏已经激活——添加写入为时已晚

以下是如何获取它的示例:

环境

项目创建

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

测试咖啡

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。如果您想并行执行多个回调或其他复杂的事情,您可以使用 Futures api。但是,如果您只是发出一个请求,或者您的请求已经是按顺序排列的,则使用同步版本的Meteor.http.get作品更容易键入。

于 2012-07-21T01:50:32.557 回答