2013-05-25 102 views
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; 
     } 
    }); 
} 

所以基本上我想將變量「用戶」重返方法findOrCreate,這樣我就可以像這樣在另一個地方使用它:

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

而是用戶=不確定的,當我註銷。這有很多麻煩。誰能幫忙?

+0

考慮一下你已經創建了一個內部函數的事實。 –

+0

在node.js中,你不能從函數返回異步結果,你必須使用回調函數。 – JohnnyHK

回答

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); 
     } 
    }); 
}; 

正如你可以看到處理所有這些回調可以讓你瘋狂。如果你沒有嘗試過的承諾尚未看一看到Q庫:http://documentup.com/kriskowal/q/

它將使你的生活更輕鬆:

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

的優點是,承諾附贈實用的抽象處理的控制流異步代碼,例如使用的承諾,你可以寫findOrCreate這樣的:

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

哪裏createIfNull是,你有if塊中的代碼(如果save也返回一個承諾的事情很容易..如果不是,你可以創建一個並返回它,看Q例子...文檔不是很直觀,但一旦你習慣了它,你會看到它真的簡化了所有回調一塌糊塗)。

0

User.getOrCreate功能沒有任何return語句,所以它當然會返回undefined,其實findOne工作異步,所以你getOrCreate功能應該是異步,所以你可以在你的函數定義更改爲:

User.findOrCreate = function(json, callback) { 

和替代return user;你應該運行的回調函數:

callback(user);