异步和回调仍然是我苦苦挣扎的概念。我一直在阅读并尝试使使用它们的代码更有意义。我不明白为什么这段代码使用回调而不是仅仅传递一个值(而不是使用参数作为要评估的值的匿名函数)。
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库对回调返回的值不执行任何操作,因此返回任何值都没有用。