6

将数据返回到流星助手方法时,我如何才能等到 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";
        }
    });

reallyLongAjaxRequest()正在跑步,我希望它在继续使用我的 itemName 助手之前完成。控制台的日志语句始终显示未定义,但那是因为 ajax 请求尚未完成。我在没有运气的情况下尝试使用 jquery。有任何想法吗

编辑:

我应该提到我在辅助函数中是有原因的。我需要渲染项目“id”,以便我可以使用该参数运行 ajax 请求。使用反应式会话将是完美的,但我不知道有一种方法可以让当前呈现的项目超出辅助方法定义吗?

4

3 回答 3

5

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

好的,给定一个名为“items”的 Meteor 集合,并希望根据 item _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 "";
};

在您的 html 中,您需要将 id 传递给帮助程序:

{{itemName _id}}

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

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

于 2013-04-18T00:35:10.120 回答
1

单独提出您的 ajax 请求,并在完成后将结果存储在 Session 变量中。然后让您的模板助手返回 Session 变量的值。大致...

$.get(url, function (data) {
  Session.set('result', data);
});

Template.item.itemName = function () {
  return Session.get('result');
};

Session是一个响应式数据源,所以当ajax调用的结果进来时,你的模板会自动更新。(当然你可以选择调用任何你喜欢的Session变量,我只是以“result”为例)。

于 2013-04-17T23:29:18.110 回答
-1

这在 MeteorJS > 1.3.x 中有效并经过测试

从控制台添加 http 包meteor add http

示例 POST 调用,其中数据元素被发送到服务器并带有自定义标头。

HTTP.call('POST', tokenUri, {
    data: {
        "type": 'authorization_code',
        //"client_id": clientId,
        "code": code,
        "redirect_uri" : redirectUri,

    },
    headers: {
        "Access-Control-Allow-Origin" : "*",
        "Access-Control-Allow-Credentials" : "true",
        "Access-Control-Allow-Methods" : "GET,HEAD,OPTIONS,POST,PUT",
        "Access-Control-Allow-Headers" : "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers",
    }
},function(error, response) {
    if ( error ) {
        console.log( error );
    } else {
        console.log( response );
    }
});
于 2016-06-29T18:12:16.050 回答