首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS异步库不会异步发送请求。

NodeJS异步库不会异步发送请求。
EN

Stack Overflow用户
提问于 2017-11-13 21:42:57
回答 1查看 50关注 0票数 0

关于异步性的问题

我编写了两个节点快速服务器,它们都运行在本地主机上。

Server1有一个简单的快捷REST,它接收来自浏览器的GET请求,此API将触发对Server2的GET请求,而请求(从Server1发送)包装在NodeJS异步库调用中。Server2将在10秒后对每个请求进行响应(使用好的旧节点的setTimeout)。

,我的想法是,-如果两个请求从Server1发送到Server2 (一秒钟接一秒钟),将会发生的事情是:

  1. Server1将向Server2发送第一个请求,而不会等待响应,从而使事件循环可用于侦听更多传入请求。
  2. 1秒后,第二个请求出现,Server1也会向Server2发出这个请求。
  3. Server2将计算每个传入请求的10秒,最终也会在对Server1的响应之间延迟1秒。
  4. Server1最终会在11秒后对这两个请求做出响应(对浏览器的响应)。

但不是!

我得到的是:

10秒后收到对浏览器的第一个请求的响应。

第二个请求的浏览器响应是在从第一个响应中再计算10秒(使其总数为20秒)后接收的,就好像根本没有异步机制一样。

(顺便说一下,我试图将Server1发送的请求包装为async.asyncify(.)、async.series(.)、async.parallel(.)--第二个请求总是在大约20秒后返回)。

为什么?

我的服务器代码:

服务器1:获取对本地主机的两个请求:9999/Work1

代码语言:javascript
运行
复制
/* ############################################
                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:

代码语言:javascript
运行
复制
/* ############################################
                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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-13 22:03:30

这不是表示或异步问题。是浏览器的问题。

如果您尝试相同的代码,但在不同的浏览器中运行并行请求,您将得到您期望的结果。

关于谷歌铬更多的细节,可以在这里找到。

Chrome stalls when making multiple requests to same resource?

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47274051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档