我的Node.js应用程序中有一个javascript函数,该函数会自行调用以在MongoDB的父子层次结构中查找其级别。文档将尝试找到其父级,如果找到,则会提高级别,并一直持续到找不到父级为止。看起来如下

function findLevel(doc, level, callback){
    if(!doc)
        return callback(null, level);
    var query = {
        id: doc.parentID
    };
    model.findOne(query, function(err, parentDoc){
        if(err){
            return callback(err, level)
        };
        return findLevel(parentDoc, level+1, callback);
    })
}


这很有可能产生无限递归调用。一种情况是parentID与当前文档的ID相同。可以通过在find查询中包含另一个条件来避免这种情况,但是我仍然担心自己可能会遗漏某些东西,并且可能导致整个应用程序崩溃/崩溃。有没有推荐的方法来避免/预防Node.js中的这种情况?还是我们可以限制递归调用的级别并优雅地停止它,就像说递归调用应该一直到此n级别一样?

最佳答案

您可以通过记录递归过程中遇到的所有ID并在之前处理完ID后立即停止来实现周期检测。

function findLevel(doc, callback) {
    var level = 0, seen = {};

    (function getParent(doc) {
        // proper termination
        if(!doc || !doc.parentID) return callback(null, level);

        // cycle detection
        if (seen.hasOwnProperty(doc.parentID)) return callback(new Error("cycle detected"));
        seen[doc.parentID] = true;

        // recursion
        model.findOne({id: doc.parentID}, function (err, parentDoc) {
            if (err) return callback(err);

            level++;
            getParent(parentDoc);
        });
    })(doc);
}

关于javascript - 如何避免/防止Node.js中的无限递归调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42409744/

10-16 13:02