在流星助手中发出ajax请求

War*_*arz 6 javascript ajax meteor

在将数据返回到meteor helpers方法时,我怎么能等到ajax请求完成.

例如,

Template.item.helpers({

        itemName:function () {
            var user = Meteor.user();

            $.when(reallyLongAjaxRequest()).done(function (a1) {
               //tried using jquery when
                return "Item Name should have this because it waited";
            });

            return " Doesnt wait at all";
        }
    });
Run Code Online (Sandbox Code Playgroud)

我有一个reallyLongAjaxRequest()运行,我希望它继续我的itemName帮助程序之前完成.控制台的日志语句始终显示未定义,但这是因为ajax请求尚未完成.我没有运气时尝试使用jquery.有任何想法吗

编辑:

我应该提一下,我在辅助函数中是有原因的.我需要呈现项目'id',以便我可以使用该参数运行ajax请求.使用被动会话将是完美的,但我不知道如何获得当前渲染项目在助手方法定义之外?

And*_*cox 5

未命名的集合是null为名称传递的集合.它是内存中的数据结构,不保存到数据库中.(http://docs.meteor.com/#meteor_collection)

好的,给定一个名为"items"的Meteor集合,并希望根据项目_id对每个项目执行ajax请求,然后能够在模板中引用ajax结果,这就是我要做的:

(大致)

var Items = new Meteor.Collection('items');
var Results = new Meteor.Collection(null);

Items.find().observeChanges({
  added: function (id) {
    $.get(url, {id: id}, function (data) {
      if (Results.findOne(id))
        Results.update(id, {$set: {result: data}});
      else
        Results.insert({_id: id, result: data});
    });
  }
});

Template.item.itemName = function (id) {
  var doc = Results.findOne(id);
  if (doc)
    return doc.result;
  else
    return "";
};
Run Code Online (Sandbox Code Playgroud)

在您的HTML中,您需要将id传递给帮助者:

{{itemName _id}}
Run Code Online (Sandbox Code Playgroud)

在定义帮助程序时,没有办法只是暂停几秒钟,以便我的ajax请求完成而不立即返回.

不,随着反应式编程事情立即发生,但是当你有新东西时你会更新.