cursor.find()回调未在metrojs中返回
cursor.find() callbacks not returning in meteorjs
我从集合返回结果,第二个结果依赖于第一个结果。所以,我找到结果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>
。
相关文章:
- 节点导出返回一个空对象
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 控制台返回var不是't定义,但它是
- 从函数返回角度承诺
- Javascript返回值只在循环中返回一次
- 从控制器返回后Ajax启动事件激发
- CKFinder 3为所选文件返回错误的URL
- 如何在d3.js中返回路径的y坐标
- 如何从jquery函数返回变量
- Angular js-返回一个包含类似
- JSONP请求返回结果,但也触发error_callback
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- JS验证ajax返回的html中的表单数据
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- AJAX:$_GET不返回任何值
- 从Javascript方法返回全局变量
- cursor.find()回调未在metrojs中返回
- 如何在metrojs中返回object contain函数