使用nodejs + koa起一个服务,使请求延时返回。
服务端代码
/** 延时 */
exports.timeoutTestData = async function (ctx) {
console.log('get query:', ctx.request.query);
const query = ctx.request.query;
let timeout = +query.timeout || 2000;
await new Promise(resolve => {
setTimeout(resolve, timeout);
});
ctx.body = {
timeout,
};
};
浏览器端
我通过浏览器js 循环同时调用5次
for (let i = 0; i < 5; i++) {
fetch('http://localhost:8080/timeoutTest')
}
现象不符合预期
虽然请求都是同时发出的(因为5个请求同时展示在浏览器控制台中),但接口返回是有先后顺序的。
调研
刚开始我怀疑的是koa框架,必须等前一个请求完成才接受下一个请求。但是node本身就是单线程异步模型,koa怎么可能要走多线程呢。
然后我打印了一下nodejs 的日志,发现服务端接收请求就是1个1个来的,得出问题应该在浏览器端。
最后根据
关于 koa 的并发问题,寻求多个请求同时处理的解决方案。 - CNode技术社区 (cnodejs.org)
得知
hsiaosiyuan0 3楼•4 年前
@daGaiGuanYu 大概是浏览器有个某个优化的策略,对同一个 URL 的资源同一时间只进行一个活动请求。可以 terminal 中开几个 tab,用
curl http://127.0.0.1:3000/
在几个 tab 中同时试一下
结论
在浏览器中,相同的请求并发只能等上一个相同请求结束后再请求下一个。
因此,使请求不相同即可,我在这几个请求参数中加上随机数。这样就可以并发了。