NodeJS 异步库不会异步发送请求
NodeJS async library will not send requests asynchronsly
关于异步的问题
我已经在本地主机上 运行 编写了 2 个节点快速服务器。
Server1
有一个简单的快速 REST API 从浏览器接收 GET 请求,这个 API 将触发对 Server2
的 GET 请求,同时请求(发送from Server1
) 包装在 NodeJS 异步库调用中。
Server2
将在 10 秒后响应每个请求(使用好的旧节点的 setTimeout
)。
我的想法是 - 如果 2 个请求从 Server1
发送到 Server2
(一个接一个)会发生什么:
Server1
会将第一个请求发送到 Server2
并且不会等待响应,使事件循环可用于侦听更多传入请求。
1 秒后第 2 个请求进来,Server1
也会发出这个请求到 Server2
。
Server2
将为每个传入请求计数 10 秒,最终也会在对 Server1
.
[ 的响应之间延迟约 1 秒进行响应。 =68=]
Server1
将在 ~11 秒后最终响应这两个请求(对浏览器的响应)。
但不是!!!
我得到的是:
浏览器对第一个请求的响应在 10 秒后收到。
从第一个响应算起又过了 10 秒(总共大约 20 秒),就收到了对第二个请求的浏览器响应,就好像根本没有异步机制在工作一样。
(顺便说一句,我试图用 async.asyncify(...), async.series(...), async.parallel(.. .) - 第二个请求总是在 ~20 秒后返回)。
为什么?
我的服务器代码:
服务器 1:将两个请求都发送到 localhost:9999/work1
/* ############################################
SERVER 1
############################################ */
const express = require('express');
const app = express();
const async = require('async');
const request = require('request');
var reqId = 1;
function requestWork(cb) {
console.log("Starting request: " + reqId);
request.get('http://localhost:8888/work2').on('response', cb);
console.log("After request: " + reqId);
}
app.get('/work1', (req, res) => {
reqId++;
async.setImmediate(requestWork, function() {
console.log("Request done!");
res.send('Easy request done: ' + reqId);
});
});
var port = 9999;
app.listen(port, () => console.log('Server 1, listening on port ' + port));
服务器 2:
/* ############################################
SERVER 2
############################################ */
const express = require('express');
const app = express();
const async = require('async');
var reqId = 100;
app.get('/work2', (req, res) => {
console.log("Got work to do: " + reqId);
setTimeout(() => {
reqId++;
res.send('Big work done: ' + reqId) ;
}, 10000);
});
var port = 8888;
app.listen(port, () => console.log('Server 2, listening on port '+ port));
这不是表达或异步问题。是浏览器的问题。
如果您尝试相同的代码,但 运行 在不同的浏览器中并行请求,您将得到您期望的结果。
对于 google chrome 可以在此处找到更多详细信息。
Chrome stalls when making multiple requests to same resource?
希望对您有所帮助。
关于异步的问题
我已经在本地主机上 运行 编写了 2 个节点快速服务器。
Server1
有一个简单的快速 REST API 从浏览器接收 GET 请求,这个 API 将触发对 Server2
的 GET 请求,同时请求(发送from Server1
) 包装在 NodeJS 异步库调用中。
Server2
将在 10 秒后响应每个请求(使用好的旧节点的 setTimeout
)。
我的想法是 - 如果 2 个请求从 Server1
发送到 Server2
(一个接一个)会发生什么:
Server1
会将第一个请求发送到Server2
并且不会等待响应,使事件循环可用于侦听更多传入请求。1 秒后第 2 个请求进来,
Server1
也会发出这个请求到Server2
。
[ 的响应之间延迟约 1 秒进行响应。 =68=]Server2
将为每个传入请求计数 10 秒,最终也会在对Server1
.Server1
将在 ~11 秒后最终响应这两个请求(对浏览器的响应)。
但不是!!!
我得到的是:
浏览器对第一个请求的响应在 10 秒后收到。
从第一个响应算起又过了 10 秒(总共大约 20 秒),就收到了对第二个请求的浏览器响应,就好像根本没有异步机制在工作一样。
(顺便说一句,我试图用 async.asyncify(...), async.series(...), async.parallel(.. .) - 第二个请求总是在 ~20 秒后返回)。
为什么?
我的服务器代码:
服务器 1:将两个请求都发送到 localhost:9999/work1
/* ############################################
SERVER 1
############################################ */
const express = require('express');
const app = express();
const async = require('async');
const request = require('request');
var reqId = 1;
function requestWork(cb) {
console.log("Starting request: " + reqId);
request.get('http://localhost:8888/work2').on('response', cb);
console.log("After request: " + reqId);
}
app.get('/work1', (req, res) => {
reqId++;
async.setImmediate(requestWork, function() {
console.log("Request done!");
res.send('Easy request done: ' + reqId);
});
});
var port = 9999;
app.listen(port, () => console.log('Server 1, listening on port ' + port));
服务器 2:
/* ############################################
SERVER 2
############################################ */
const express = require('express');
const app = express();
const async = require('async');
var reqId = 100;
app.get('/work2', (req, res) => {
console.log("Got work to do: " + reqId);
setTimeout(() => {
reqId++;
res.send('Big work done: ' + reqId) ;
}, 10000);
});
var port = 8888;
app.listen(port, () => console.log('Server 2, listening on port '+ port));
这不是表达或异步问题。是浏览器的问题。
如果您尝试相同的代码,但 运行 在不同的浏览器中并行请求,您将得到您期望的结果。
对于 google chrome 可以在此处找到更多详细信息。
Chrome stalls when making multiple requests to same resource?
希望对您有所帮助。