cursor.find()回调未在metrojs中返回

cursor.find() callbacks not returning in meteorjs

本文关键字:metrojs 返回 回调 find cursor      更新时间:2023-09-26

我从集合返回结果,第二个结果依赖于第一个结果。所以,我找到结果A,结果B必须是任何不等于结果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](它不能是该方法的参数,因为函数是不可序列化的),则该方法将异步运行:它不会返回任何特别的内容,也不会引发异常。

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

我可以通过包装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" );
  }
});

我希望它在运行时会在浏览器中显示"[对象,对象]",但我认为您已经预料到了这一点,并将在返回某些内容后更改模板调用。

同样,在您的模板中,您的最后一个<hr>应该是</hr>