异步和回调仍然是我苦苦挣扎的概念。我一直在阅读并尝试使使用它们的代码更有意义。我不明白为什么这段代码使用回调而不是仅仅传递一个值(而不是使用参数作为要评估的值的匿名函数)。

Shorten.prototype.Lookup = function (url, callback){
    var mongoose = this.app.locals.settings.mongoose;
    var Cursor = mongoose.model('urls');
    Cursor.find({"linkFinal": url}, function(err, docs){
        if (err === null){
            if (typeof(callback) === "function"){
                if (docs[0] !== undefined){
                    callback(docs[0]);
                    return docs[0];
                }else{
                    callback(false);
                    return false;
                }
            }
        }else{
            console.log(err);
        }
    });
};


这是用例中的代码功能:

shorten.LookUp(url, function(urlCheck){
           if (urlCheck === false){
                //Add to db
                // another function that uses a callback as second parameter
                shorten.addLink(shortenURL, shortURL){
                    small.shortenedURL = "http://" + domain + "/" + shortURL.link;
                    small.shortenError = false;
                    small.alreadyShortened = false;
                    res.json(small);
                });
            }else{

                small.shortenedURL = "http://" + domain + "/" + urlCheck.link;
                small.shortenError = false;
                small.alreadyShortened = true;
                res.json(small);
            }
        });


对于在这种情况下为什么要使用回调函数的唯一直觉是,当对数据库进行查询时(在本例中为使用Mongoose api的mongodb),该函数仅在数据可用时才运行(在这种情况下) :

    // after the result of the query is ran, the result is passed to the function in
    // the docs parameter.
    Cursor.find({"linkFinal": url}, function(err, docs){


这是我想出为什么传递回调而不是仅仅传递值的主要原因。我仍然不能百分百确定为什么这行不通:

Shorten.prototype.LLookUp = function (url, value){
    var mongoose = this.app.locals.settings.mongoose;
    var Cursor = mongoose.model('urls');
    Cursor.find({"linkFinal": url}, function(err, docs){
        if (err === null){
                if (docs[0] !== undefined){
                    return docs[0];
                }else{
                    value = false;
                    return false;
                }
            }
        }else{
            console.log(err);
        }
    });
};


在这种情况下,我要做的就是删除匿名函数,并传递该函数的参数。


为什么在第一个代码段中首选回调而不是仅仅
吵架?
第三个代码段是否可行?如果没有,为什么?


谢谢!

最佳答案

return语句位于回调函数内部,而不是LLookUp函数。因此,它们将返回给调用回调的任何人(mongoose库),但是mongoose库对回调返回的值不执行任何操作,因此返回任何值都没有用。

10-07 19:48
查看更多