javascript - NodeJS 异步库不会异步发送请求

标签 javascript node.js asynchronous request async.js

关于异步的问题

我编写了 2 个 Node Express 服务器,它们都在本地主机上运行。

Server1 有一个简单的快速 REST API,用于接收来自浏览器的 GET 请求,该 API 会触发向 Server2 发送 GET 请求,而该请求(从 发送) Server1)被包装在 NodeJS 异步库调用中。 Server2 将在 10 秒后响应每个请求(使用旧 Node 的 setTimeout)。

我的想法是 - 如果从 Server1Server2 发送 2 个请求(一个接一个),会发生什么:

  1. Server1 将向 Server2 发送第一个请求,并且不会等待响应,从而使事件循环可监听更多传入请求。

  2. 1 秒后,第二个请求传入,Server1 也会将这个请求发送到 Server2

  3. Server2 将为每个传入请求计算 10 秒,最终也会在对 Server1 的响应之间延迟约 1 秒的延迟。

  4. Server1 最终将在约 11 秒后响应这两个请求(响应浏览器)。

但不是!!!

我得到的是:

10 秒后收到浏览器对第一个请求的响应。
从第一个响应算起又过了 10 秒(总共约 20 秒),浏览器收到第二个请求的响应,就好像异步机制根本没有工作一样。

(顺便说一句,我尝试用 async.asyncify(...)、async.series(...)、async.parallel(...) 包装 Server1 发送的请求 - 第二个请求总是返回约 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?

希望这有帮助。

关于javascript - NodeJS 异步库不会异步发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47274051/

相关文章:

javascript - 排序表不对输入进行排序

node.js - Twilio statusCallback 实现遇到麻烦

javascript - react Node 依赖安装破坏了我的 react native 应用程序

javascript - jquery ajax 成功回调中的 window.open 会阻止后续的 ajax 调用

multithreading - Clojure core.async,超时后CPU挂起。无论如何要正确杀死 (go..) block 产生的宏线程?

javascript - 如何在光滑 slider 的左侧对齐?

javascript - 如何为创建的 div 设置类名

javascript - 是否可以将标志传递给 Gulp 以使其以不同的方式运行任务?

Angular - 在模板中多次使用异步管道时可观察到......好的做法还是坏的?

javascript - 根据角色 Angular 不同的模板 url