node.js的那点事
1,
长轮训(
long polling
):
一种利用HTTP模拟持续连接的技巧。
具体来说,只要页面载入了,不管你需不需要服务器给你响应信息,你都会给服务器发一个Ajax请求。这个请求不同于一般的Ajax请求,服务器不会直接给你返回信息,而是它要等着,直到服务器觉得该给你发信息了,它才会响应。比如,你的好友发了一条新鲜事,服务器就会把这个新鲜事当做响应发给你的浏览器,然后你的浏览器就刷新页面了。浏览器收到响应刷新完之后,再发送一条新的请求给服务器,这个请求依然不会立即被响应。于是就开始重复以上步骤。利用这个方法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的Http参与,但是我们模拟出了一个看似持续的连接状态(传统服务器(
Apache)
每次一个新用户连到你的网站上,你的服务器就得开一个连接)
2,非阻塞: 把非阻塞的服务器想象成一个loop循环,这个loop会一直跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这loop就接着跑,接其他的请求。这样下来,服务器就不会像之前那样傻等着数据库返回结果了。
3,数据驱动: 如果数据库把结果返回来了,loop就把结果传回用户的浏览器,接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事件发生的时候才响应 。
4, WebSocket技术:(长 轮询会被替代)
5, Express(服务端框架)
6,koa入门: https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001471087582981d6c0ea265bf241b59a04fa6f61d767f6000
7,异步嵌套
2,非阻塞: 把非阻塞的服务器想象成一个loop循环,这个loop会一直跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这loop就接着跑,接其他的请求。这样下来,服务器就不会像之前那样傻等着数据库返回结果了。
3,数据驱动: 如果数据库把结果返回来了,loop就把结果传回用户的浏览器,接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事件发生的时候才响应 。
4, WebSocket技术:(长 轮询会被替代)
5, Express(服务端框架)
6,koa入门: https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001471087582981d6c0ea265bf241b59a04fa6f61d767f6000
7,异步嵌套
// 就像下面这样:
// 你不在乎下面这三个ajax的执行顺序还好
// 如果你在乎顺序呢?
$
.
get
(
'url'
,
function
(
)
{
}
,
'json'
)
;
$
.
get
(
'url1'
,
function
(
)
{
}
,
'json'
)
;
$
.
get
(
'url2'
,
function
(
)
{
}
,
'json'
)
;
// 就像这样?
$
.
get
(
'url'
,
function
(
)
{
$
.
get
(
'url1'
,
function
(
)
{
$
.
get
(
'url2'
,
function
(
)
{
}
,
'json'
)
;
}
,
'json'
)
;
}
,
'json'
)
;
// 下面是我最近写的一段Node.js的代码
// 其实这个嵌套也不算多
// 如果业务逻辑相当复杂起来呢?
// 嵌套20 30层?
var
adminIndex
=
function
(
params
,
callback
)
{
storeAdmin
.
getApiTokens
(
function
(
err
,
tokens
)
{
if
(
err
)
{
callback
(
err
)
;
return
;
}
storeAdmin
.
getApiServices
(
function
(
err
,
apiServices
)
{
if
(
err
)
{
callback
(
err
)
;
return
;
}
storeAdmin
.
getSocketioServices
(
function
(
err
,
socketioServices
)
{
if
(
err
)
{
callback
(
err
)
;
return
;
}
callback
(
0
,
{
status
:
true
,
data
:
{
api_tokens
:
tokens
,
api_services
:
apiServices
,
socketio_services
:
socketioServices
}
})
;
})
;
})
;
})
;
}
;
8,
Promise对象(解决异步嵌套的弊端)
var
val
=
1
;
// 我们假设step1, step2, step3都是ajax调用后端或者是
// 在Node.js上查询数据库的异步操作
// 每个步骤都有对应的失败和成功处理回调
// 需求是这样,step1、step2、step3必须按顺序执行
function
step1
(
resolve
,
reject
)
{
console
.
log
(
'步骤一:执行'
)
;
if
(
val
>=
1
)
{
resolve
(
'Hello I am No.1'
)
;
}
else
if
(
val
===
0
)
{
reject
(
val
)
;
}
}
function
step2
(
resolve
,
reject
)
{
console
.
log
(
'步骤二:执行'
)
;
if
(
val
===
1
)
{
resolve
(
'Hello I am No.2'
)
;
}
else
if
(
val
===
0
)
{
reject
(
val
)
;
}
}
function
step3
(
resolve
,
reject
)
{
console
.
log
(
'步骤三:执行'
)
;
if
(
val
===
1
)
{
resolve
(
'Hello I am No.3'
)
;
}
else
if
(
val
===
0
)
{
reject
(
val
)
;
}
}
new
Promise
(
step1
)
.
then
(
function
(
val
)
{
console
.
info
(
val
)
;
return
new
Promise
(
step2
)
;
})
.
then
(
function
(
val
)
{
console
.
info
(
val
)
;
return
new
Promise
(
step3
)
;
})
.
then
(
function
(
val
)
{
console
.
info
(
val
)
;
return
val
;
})
.
then
(
function
(
val
)
{
console
.
info
(
val
)
;
return
val
;
})
;
// 执行之后将会打印
步
骤
一
:
执
行
Hello
I
am
No
.
1
步
骤
二
:
执
行
Hello
I
am
No
.
2
步
骤
三
:
执
行
Hello
I
am
No
.
3
Hello
I
am
No
.
3