我从一个集合中返回结果,第二个结果依赖于第一个结果。所以,我找到了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中](它不能作为方法的参数,因为函数不可序列化),该方法将异步运行:它将不返回任何内容特别是不会抛出异常。
所以我假设因为收集操作也是一个流星调用,那么这就是为什么忽略了返回。
答案 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>
。