2011-12-23 7 views
0

У меня есть функция 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"); 
       } 
      }) 
     } 
    }) 
} 

Я не понимаю, почему он не доходит до конца функции без каких-либо ошибок. Есть ли ошибка в этом фрагменте кода?

Ну, на самом деле, он иногда достигает конца функции, но почти всегда это не так.

Спасибо

+0

Что именно вы имеете в виду, когда вы говорите, в конце функционировать? Функция findOne и find являются асинхронными, поэтому они не будут работать до тех пор, пока не вернется insertUserArticleToAllSubscribers. – loganfsmyth

ответ

1

Предполагая, что Provider.findOne() на самом деле вызова функции обратного вызова (надеюсь безопасное предположение), то вам, вероятно, потребуется else на первом if(provider) вызова.

Прямо сейчас у вас есть эта логическая структура:

function (...) { 
    Provider.findOne(..., function (...) { 
     if (err) { ... } 
     if (provider) { 
      User.find(..., function(...) { 
       if (err) { ... } 
       if (users) { ... } 
       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 :('); 
     } 
    }) 
Смежные вопросы