【问题标题】:cursor.find() callbacks not returning in meteorjscursor.find() 回调没有在meteorjs中返回
【发布时间】:2013-07-23 07:53:37
【问题描述】:

我从一个集合返回结果,第二个结果依赖于第一个。所以,我找到了 resultA,而 resultB 必须是不等于结果 A 的任何东西。

我的 console.log 语句显示了我想要的数据,但是,当我返回它时,我的车把模板中没有显示任何内容。即使我 JSON.stringify 它也没有任何返回。

myCollection.find({}, {limit:1, skip: _.random(minimum, maximum)}).forEach(function(a){

        myCollection.find({'': {$ne: a._id}}, {limit:1}).forEach(function(b){

            console.log({resultA: a, resultB: b})

            return {resultA: a, resultB: b};        

        });

    });

我在这里做错了什么?

现在我尝试使用 deps.autorun 以防集合尚未准备好(这是因为 console.log 始终有效)

Template.votes.helpers({
twoItems: function(){
    var minimum = 0;
    Deps.autorun(function(){
        var maximum = (Items.find().fetch().length) - 1;

        if (maximum){
            var itemA = Items.find({}, {limit:1, skip: _.random(minimum, maximum)}).fetch()[0];
        }

        if(itemA){
            console.log(itemA);
            var itemB = Items.find({'': {$ne: itemA._id}}, {limit:1}).fetch()[0];   
        }

        if (itemB) {
            data = {itemA:itemA, itemB:itemB};
            console.log(data);
            return data;
        }
    });
},});

使用简单的模板:

<template name="votes">
<p>Test</p>
<hr>
{{twoItems}}
<hr></template>

至少它应该返回 Object 但什么也没有。 Console.log 总是返回正确的数据,但渲染的车把模板中没有显示任何内容。

编辑:我最终不得不使用以下内容:

    twoItems: function(){
    var minimum = 0;
    var maximum = (Items.find().fetch().length) - 1;
    var itemA = Items.find({}, {limit:1, skip: _.random(minimum, maximum)}).forEach(function(a){
        Session.set('itemAid', a._id);  
    });

    var itemA = Items.find({'_id': Session.get('itemAid')}).fetch()[0];
    var itemB = Items.find({'_id': {$ne: Session.get('itemAid')}}, {limit:1,skip: _.random(minimum, maximum - 1)}).fetch()[0];

    return {itemA: itemA, itemB: itemB};
},

我仍然不知道为什么回调不能返回任何东西。在文档中它说

如果您将回调函数作为最后一个参数 [In a Meteor.Call](它不能作为方法的参数,因为函数不可序列化),则该方法将异步运行:它不会返回任何内容特别是不会抛出异常。

所以我假设由于收集操作也是一个流星调用,所以这就是返回被忽略的原因。

【问题讨论】:

  • 贴出车把的代码
  • 对,这个错误最有可能在Handlebars中。
  • 感谢您的回复。我的车把里只有 {{twoItems}}。我也试过 {{#each twoItems}}{{this}}{{/each}}。然而,奇怪的是,如果我将 return 语句 outside forEach(或 map)回调,那么它会返回并显示示例数据。但是 find 回调中的任何内容都不会返回。但我知道回调中的代码会被执行,因为我所有的 console.log() 语句都会在 foreach 和/或 map 回调中执行。
  • hm...是不是因为返回的地方不是车把?
  • 您在 Meteor.call() 中包含的报价无关紧要。 Meteor.call() 是一个调用流星方法的函数。您没有使用 Meteor.call() 或任何流星方法。

标签: javascript meteor


【解决方案1】:

我可以通过包装我在 Deps.autorun 中的一些工作模板帮助程序来复制这个问题,正如你所说 - 控制台日志显示它运行但浏览器中没有任何内容。

更标准的写法可能是:

Deps.autorun(function(){
  var itemA, itemB;
  var minimum = 0;
  var maximum = (Items.find().fetch().length) - 1;

  if (maximum){
    itemA = Items.findOne({}, {skip: _.random(minimum, maximum)});
  }

  if(itemA){
    console.log(itemA);
    itemB = Items.findOne({ _id: {$ne: itemA._id}});   
  }

  if (itemB) {
    var data = {itemA:itemA, itemB:itemB};
    console.log(data);
    Session.set( "twoItems", data);
  }
});

Template.votes.helpers({
  twoItems: function(){
    return Session.get( "twoItems" );
  }
});

我希望这会在运行时在您的浏览器中显示“[object, object]”,但我认为您会期待这一点,并且会在返回某些内容后更改模板调用。

此外,在您的模板中,您的最后一个 &lt;hr&gt; 应该是 &lt;/hr&gt;

【讨论】:

  • 感谢它似乎与会话设置一起工作。在这种情况下,您对 return 语句的去向有什么想法吗?
  • 我不太了解内部工作原理。模板系统已经在其输入中寻找反应性,并通过在其中嵌套第二组依赖项,我希望它会放弃。通过删除自动运行代码,您的代码也可能已经工作并保持反应性。不过我不太确定
  • 不幸的是它没有用。它抱怨如果助手无法访问外部的任何集合。但我确实最终使用了会话。让我也发布一下。
  • 我已经编辑了我的原始消息。请检查这是否有意义。
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多