今天开始在跟着alsotang大神的node lessons学习node,之前有些Rails的经验,除了node也在从头学习JS,学习过程中遇到一个问题:
发现调用方法的时候自己完全不知道该传入什么参数,拿下面这个例子说吧,
app.get('/', function (req, res, next) {
// 用 superagent 去抓取 https://cnodejs.org/ 的内容
superagent.get('https://cnodejs.org/')
.end(function (err, sres) {
// 常规的错误处理
if (err) {
return next(err);
}
// sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
// 剩下就都是 jquery 的内容了
var $ = cheerio.load(sres.text);
var items = [];
$('#topic_list .topic_title').each(function (idx, element) {
var $element = $(element);
items.push({
title: $element.attr('title'),
href: $element.attr('href')
});
});
res.send(items);
});
});
这段代码配上注解清楚得一塌糊涂 :) 但,这些传入的回掉函数的参数我怎么知道该传哪些进去呢?譬如function(req, res, next)
里面的next是哪里来的?又譬如function (err, sres)
中的sres,不光是node,我发现之前看到很多js框架都有同样一个问题,我跑去看了下文档,也都没有具体说明,对js整个生态不熟悉,很是苦恼啊,还望高人指点
3 回复
Node.js中的很多都是异步回调来获取执行结果。因此存在很多回调函数,回调函数也是函数,既然是函数就存在函参,因此你所说的那些都是异步函数的执行结果,为了能够将获取这些执行结果,其将执行结果作为参数传递到回调函数中。 那这些参数就是异步函数的执行结果,返回的信息。 例如:app.get('/’, function (req, res, next) {}),其中res和req,next就是所谓app.get函数执行后返回结果,由于是异步的因此你无法通过 var result = app.get('/’, function (req, res, next) {}); 上面的方式获得执行结果,因此其通过匿名回调函数function的函数参数中,获取执行结果。
//some code which is like in express
var app = {};
app.get = function(str, callback) {
var req = app.req;
var res = app.res;
//somecode do with str
//...
//at last
callback(req, res);
};
//import code
app.get('/', function(req, res) { // this function is param which you pass to app.get()
//do with req res
});
//and you can write like this
function hanlder(req, res) {
//do with req res
};
app.get('/app', handler);
写了一点示例代码,当你调用app.get的时候需要给他传递一个函数参数,这里面你用的是匿名函数function(req,res){};
多了解一下回调函数就明白了。可以百度一下js回调函数