0

所以我有这个方法让用户对象检查现有记录。

User.findOrCreate = function(json){
    User.findOne({'email' : json.email}, function(err, user){
        if (!user){
            user = new User({
                id: json.id,
                email: json.email,
                f_name: json.first_name,
                l_name: json.last_name,
                gender: json.gender,
                locale: json.locale
            });
            user.save(function(err){
                if (err) return handleError(err);
                return user;
            });
        } else {
            return user;
        }
    });
}

所以基本上我想将变量“user”返回给findOrCreate方法,这样我就可以在另一个地方使用它,如下所示:

var user = User.findOrCreate(profile._json);

但是,当我注销时, user = undefined 。在这方面有很多麻烦。任何人都可以帮忙吗?

4

2 回答 2

0

User.getOrCreate函数没有任何return声明,所以它当然会返回undefined,实际上findOne正在异步工作,所以你的getOrCreate函数也应该是异步的,所以你可以将你的函数定义更改为:

User.findOrCreate = function(json, callback) {

而不是return user;你应该运行回调函数:

callback(user);
于 2013-05-25T18:48:24.430 回答
0

你不能这样做:

var user = User.findOrCreate(profile._json);

因为执行User.findOne是异步的,所以findOrCreate返回时,可能User.findOne还没有执行。

获取用户价值的正确方法是使用另一个回调findOrCreate

User.findOrCreate = function(json, callback){
    User.findOne({'email' : json.email}, function(err, user){
       if (!user){
           user = new User({
               id: json.id,
               email: json.email,
               f_name: json.first_name,
               l_name: json.last_name,
               gender: json.gender,
               locale: json.locale
            });
            user.save(function(err){
               if (err) return handleError(err);
               callback(user);
            });
        } else {
            callback(user);
        }
     });
};

正如你所看到的,处理所有这些回调会让你发疯。如果您还没有尝试过 promise,请查看 Q 库:http ://documentup.com/kriskowal/q/

它将使您的生活变得轻松:

 var userPromise = User.findOrCreate(profile._json);
 /* then when you need a user */
 userPromise.done(function (user) { /* do something */ });

优点是 Promise 带有非常有用的抽象来处理异步代码的控制流,例如使用 Promise 你可以findOrCreate这样写:

  User.findOrCreate = function(json) {
       return User.findOne({email:json.email}).then(createIfNull);
  };

createIfNull您在块内的代码在哪里if(如果save还返回一个承诺,事情很容易......如果不是,你可以创建一个并返回它,请参阅 Q 示例......文档不是很直观,但一旦你习惯了你会看到它真的简化了所有的回调混乱)。

于 2013-05-25T20:08:14.027 回答