没有达到功能的结束

时间:2011-12-23 14:10:45

标签: node.js callback mongoose

我有一个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");
                }
            })
        }
    })
}

我不明白为什么在没有抛出任何错误的情况下它没有到达函数的末尾。这段代码中有错误吗?

实际上,它有时会到达函数的末尾,但几乎总是没有。

谢谢

1 个答案:

答案 0 :(得分: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 :(');
        }
    })