cursor.find()回调没有在meteorjs中返回

时间:2013-07-24 01:40:24

标签: javascript meteor

我从一个集合中返回结果,第二个结果依赖于第一个结果。所以,我找到了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};
},

我仍然不知道为什么回电不能退货。在文档中它说

  

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

所以我假设因为收集操作也是一个流星调用,那么这就是为什么忽略了返回。

1 个答案:

答案 0 :(得分: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]”,但我认为您期待这一点,并且会在返回内容后更改模板调用。

同样在您的模板中,您的上一个<hr>应为</hr>