Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
305 views
in Technique[技术] by (71.8m points)

关于node跟chrome的异步请求问题

疑问1:测试发现http.get要等其他代码执行完才会请求,node不是异步非阻塞的吗

疑问2:chrome浏览器执行ajax是异步非阻塞的,node跟chrome引擎是不一样的吗

测试代码1(node v6.17.1)
最终打印的时间为get请求+for循环的时间

var http=require('http');
var url=require('url');
var util=require('util');

//客户端请求
console.time("共花费了");
var request=http.get('xxx',function(res){
    res.on('data',function(data){
        console.timeEnd("共花费了");
    })
});

var num = 0
for (var i = 1; i < 9000000000; i++) {
    num += i
}

测试代码2(chrome)
最终打印的时间为get请求所花费的时间,而不是get跟for相加的时间

console.time('总共');
var xhr = new XMLHttpRequest();
xhr.open("GET", "xxx", true);
xhr.onload = function (e) {
    console.timeEnd('总共');
};
xhr.send(null);

var num = 0;
for (i = 0; i < 200000000; i++) { 
    num += i;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

稍微看了一下 http.get 的源码,看到有 process.nextTick ,猜测跟这个有关。

浏览器端 xhr.send 一旦被调用,浏览器就会分出一个线程去负责这个网络请求,而 nodejs 这边调用 http.get 其实是需要等到下一个 tick 底层的 socket 才会开始连接,而这个时候一个长 for 循环使得 nextTick 一直拖着触发不了,也就意味着 for 循环不结束网络请求其实就压根没发出去。

有兴趣可以看下源码 _http_client.js#L305


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...