2011-12-23 12 views
0

DBにUserArticleを追加するJS関数があります(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"); 
       } 
      }) 
     } 
    }) 
} 

エラーを投げずに機能の最後に到達しない理由はわかりません。このコードにバグはありますか?

実際、機能の終わりに達することはありますが、ほとんどの場合、機能しないことがあります。

はProvider.findOne()は実際に(できれば安全な仮定)コールバックを呼び出している場合、あなたはおそらく最初if(provider)呼び出しでelseを必要とすると仮定すると、あなたに

+0

は正確にあなたが何を意味するか:あなたはこのように変更した場合

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

おそらく、結果を取得します:

は今、あなたは、この論理構造を持っています関数? findOneとfindの関数は非同期なので、insertUserArticleToAllSubscribersが返されるまで実行されません。 – loganfsmyth

答えて

1

ありがとうございます。あなたがの終わりを言うとき

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 :('); 
     } 
    }) 
関連する問題