流星 - 没有更多回调" findOne"功能

时间:2014-12-01 19:18:48

标签: mongodb meteor

我正在研究Meteor项目,我必须说这根本不容易,特别是对于一件事:回调!

一切都是异步的,所以我想知道如何从我的mongodb获得结果。

var user = Meteor.users.findOne({username: "john"});
return (user); // sometimes returns "undefined"

...

var user = Meteor.users.findOne({username: "john"});
if (user)                    // so ok, I check if it exists!
    return (user);           // Cool, I got my user!
return ();                   // Ok and what should I return here? I want my user!

我不想变脏,并且像setTimeout一样放在任何地方。 有人有解决方案吗?


编辑: 我在带有console.log的router.js中注意到我的数据返回了4次。带有未定义值的2次,带有预期值的2次。在视图中,它仍然未定义。 为什么路由器在此路由中传递了4次?它是否显示路由器中返回值的第一个结果?

如果find()找不到任何内容,我应该返回什么?


编辑2:以下是一些需要了解的代码。

this.route('profilePage', {
    path: 'profil/:_id?',
    waitOn: function() {
        return [
        Meteor.subscribe('article', { prop: this.params._id}), // id can be id or username
        Meteor.subscribe('article', { userId: this.params._id}), // id can be id or username
        Meteor.subscribe('params'),
        Meteor.subscribe('profil', (this.params._id ? this.params._id : Meteor.userId()))
        ];
    },
    data: function() {
        if (this.params._id) {
            var user = Meteor.users.findOne(this.params._id);
            if (!user)
                user = Meteor.users.findOne({username: this.params._id});
            console.log(user);
            return user;
        }
        else if (Meteor.userId())
            return Meteor.user();
        else
            Router.go("userCreate");
    }
});

我在控制台上看到了这个: http://puu.sh/debdJ/69419911f7.png

(以下文字版)

undefined
undefined
Object_id: "o3mgLcechYTtHPELh"addresses: (....)
Object_id: "o3mgLcechYTtHPELh"addresses: (....)

3 个答案:

答案 0 :(得分:4)

findOne(yourId)是一种同步方法,相当于find({ _id: yourId}, callback)。不同之处在于find()允许您定义回调。如果您没有将回调传递给find(),则此方法将同步。

检查wrapAsync:http://docs.meteor.com/#/full/meteor_wrapasync 它允许您使用sync操作以async样式进行编码。

关于EventedMind的免费课程:https://www.eventedmind.com/feed/meteor-meteor-wrapasync

答案 1 :(得分:0)

到目前为止,我的经验是Meteor Mongodb软件包是函数通常不提供回调(由于某种原因,insert会...),函数是原子的(因此是同步的)。

如果你愿意的话,有些流星包可以让Mongodb异步(我没有尝试过)。

我猜这种同步方法符合Mongodb的简单维护目标。考虑到这一点,我的一个使用Node的烦恼是使用异步回调瀑布/嵌套,它们很难创建和维护......希望这将使我的代码更容易阅读,理解和改变......

答案 2 :(得分:0)

InputId      ReturnedRowId
----------------------------
1             1
2             1
3             1
4             1
5             5
6             1
7             1
8             8
9             8
你需要在server / startup.js上的

: 未来= Npm.require('纤维/未来');