2011-12-23 39 views
0

我有一個JS函數,它將一個UserArticle添加到數據庫(使用mongoose和NodeJS)。問題是它沒有達到目的。未達到函數的末尾

我的意思是,我試圖確定在哪個地方大部分時間到達並且在Provider.findOne之前,或在User.find之前。


var insertUserArticleToAllSubscribers = function (base_ua, providerId) { 
    var Provider = mongoose.model('Provider'); 
    var User = mongoose.model('User'); 
    var UserArticle = mongoose.model('UserArticle'); 
    Provider.findOne({"twitter_id": providerId}, function (err, provider) { 
     if (err) { 
      console.log(err); 
      return; 
     } 
     if (provider) { 
      User.find({"subscribed": provider._id}, function (err, users) { 
       if (err) { 
        console.log (err); 
        return; 
       } 
       if (users) { 
        for (i in users) { 
         var ua = new UserArticle ({"user": users[i], "article":base_ua.article, "place":base_ua.place, "read":0, "starred":0}); 
         ua.save(function (err) { 
          if (err) console.log(err); 
          logAddedArticle(ua._id, users[i]); 
          console.log("ArticleAdded!: " + ua._id);    

         }); 

        } 
       } else { 
        console.log("No users"); 
       } 
      }) 
     } 
    }) 
} 

我不明白爲什麼它沒有拋出任何錯誤到達函數的末尾。這段代碼中有錯誤嗎?

那麼,事實上,它有時會達到功能的結束,但幾乎總是沒有。

謝謝

+0

究竟你的意思:

現在你有這樣的邏輯結構:

function (...) { Provider.findOne(..., function (...) { if (err) { ... } if (provider) { User.find(..., function(...) { if (err) { ... } if (users) { ... } else { ... } }) } }) 

,如果你將它更改爲這一點,你可能會得到一個結果功能? findOne和find中的函數是異步的,所以它們在insertUserArticleToAllSubscribers返回之後纔會運行。 – loganfsmyth 2011-12-23 14:51:08

回答

1

假設Provider.findOne()實際上是調用回調(希望一個安全的假設),那麼你可能在第一if(provider)調用需要一個else。當你說的到底

function (...) { 
    Provider.findOne(..., function (...) { 
     if (err) { ... } 
     else if (provider) {     // MAKE THIS AN ELSE IF 
      User.find(..., function(...) { 
       if (err) { ... } 
       else if (users) { ... }  // MAKE THIS AN ELSE IF! 
       else { ... } 
      }) 
     } 
     else {         // ADD THIS ELSE! 
      console.log('findOne() found nuttin :('); 
     } 
    })