js中的回调函数

node.js中的路由模块回调函数的理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function start (route,handle) {
// body...
function onRequest (request,response) {
var pathname=url.parse(request.url).pathname;
response.writeHead(200, {"Content-Type": "text/plain"});
var content=route(handle,pathname);
console.log(content);
response.write(content);
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("server start...");
}

回调函数会延迟执行,是在包含函数的函数体内指定位置调用
调用的时机与外层的函数有关
该函数是被预先定义,还是匿名函数,都无关紧要(不要注意这些细节==)
本质上只是传递了函数的定义,并不执行
在找个例子中,作为一个开启服务器的函数,无论何时服务器收到一个请求,都会调用onRequest()

举个栗子

1
2
3
4
5
6
$('.button').click(function (parameter) {
#statements
});
$(function(){
});

第一个jquery函数中,回调函数是$(‘.button’).click();
只有在元素触发click时才会回调


通过回调聊聊阻塞和非阻塞

node.js单线程多并发的原因

Apache是​​多线程的:它每个请求产生一个线程(或者进程,它取决于conf)。
随着并发连接的数量增加,需要更多的线程来为多个同时的客户端提供服务。
可以看到这种开销如何消耗内存。Nginx和Node.js不是多线程的,因为线程和进程承载了大量的内存成本。
它们是单线程的,但是基于事件。这消除了通过在单个线程中处理许多连接而由数千个线程/进程创建的开销。
Mixu的博文

这句话的意思是说,Node.js 可以在不新增额外线程的情况下,依然可以
对任务进行并行处理 —— Node.js 是单线程的。它通过事件轮询(event
loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能
的避免阻塞操作,取而代之,多使用非阻塞操作。
然而,要用非阻塞操作,我们需要使用回调,通过将函数作为参数传递给
其他需要花时间做处理的函数(比方说,休眠 10 秒,或者查询数据库,
又或者是进行大量的计算)。
对于 Node.js 来说,它是这样处理的:“ 嘿, probablyExpensiveFunction()
(译者注:这里指的就是需要花时间处理的函数),你继续处理你的事情,
我( Node.js 线程)先不等你了,我继续去处理你后面的代码,请你提供
一个 callbackFunction() ,等你处理完之后我会去调用该回调函数的,谢
谢! ”