Nodejs环境下Ajax请求是并发还是串行的?

Nodejs环境下Ajax请求是并发还是串行的?

for (var i = 0; i < 100; i++) { $.get(‘http://localhost’, { id:123}, function(res){}); } 例如这样的代码,浏览器是同时请求的吗?

13 回复

Node.js 环境下 Ajax 请求是并发还是串行的?

在讨论 Node.js 环境下的 Ajax 请求时,我们首先要明确一点:Ajax 请求是在客户端(通常是浏览器)发起的,而不是在服务器端。因此,我们主要讨论的是浏览器中的 Ajax 请求行为。

并发 vs. 串行

  • 并发:多个请求几乎同时被发起,并且可能几乎同时完成。
  • 串行:一个请求完成后,才会发起下一个请求。

示例代码

假设你有以下 JavaScript 代码:

for (var i = 0; i < 100; i++) {
    $.get('http://localhost', {
        id: 123
    }, function(res) {
        console.log("Request " + i + " completed with response:", res);
    });
}

这段代码会在循环中发起 100 次 $.get 请求。在现代浏览器中,这些请求通常会并发执行,而不是串行执行。

解释

  1. 浏览器的行为

    • 浏览器通常会并行处理多个请求,以提高用户体验。具体来说,现代浏览器通常会为每个域名并行处理 6 到 8 个连接。
  2. 网络层的行为

    • HTTP/1.1 和 HTTP/2 协议支持并发请求。HTTP/2 特别引入了多路复用技术,允许在一个连接上并发传输多个请求和响应。
  3. JavaScript 异步特性

    • 在 JavaScript 中,$.get 是一个异步函数。这意味着它不会阻塞其他代码的执行,从而允许其他请求可以立即发起。

实际效果

虽然代码看起来像是在循环中依次发起请求,但实际上这些请求会并发执行。由于这些请求是非阻塞的,浏览器会在短时间内尽可能多地发起请求,从而利用网络带宽和服务器资源。

总结

在 Node.js 环境下,如果你使用 jQuery 的 $.get 方法发起 100 次请求,这些请求通常会并发执行,而不是串行执行。这是因为现代浏览器和网络协议都支持并发请求,以优化性能和用户体验。


理论上是同时的

不是,浏览器会另起线程来发起http请求,请求完成后会把回调函数塞到事件队列里面进行

并发,代码中的匿名函数 function(res){} 就是回调用的了

建议lz看看这篇文章:http://elseif.me/archives/103

谢谢。

$.get(url, { async: false/true }, callback) async默认是true

并发,不过也受同一域名的最大连接数限制。

ajax是异步请求的

这能说浏览器端是并发的,服务器端可能会有限制,我写过这类脚本,被坑惨了,看似并发发送请求,服务器却是一个一个返回,并发的6个ajax,因为处理时间比较长,全是挂起,一个处理返回,下一个才被处理。

你并没有用Worker创建进程,本质上并不是并发, 只有一个js进程。

ajax中的js只是连续执行了$.get()函数里边的代码, 而get内部的tcp通信,则是由操作系统与目标打交道, 操作系统是支持并发的, 如果前边的没有响应完, 后边的可以继续并发。

跟 new Worker(‘a.js’)使用js子进程是不一样的。

那是因为你没有设置异步,ajax既可以同步也可以异步, 同步则是要等待操作系统返回结果再运行。

在Node.js环境下,使用Ajax发起的HTTP请求通常是并发执行的,而不是串行执行。现代浏览器会并行地处理多个网络请求以提高性能。具体来说,每个$.get调用都会生成一个新的异步请求,这些请求可以同时发起。

以下是示例代码,展示了如何在Node.js中使用axios库来发起并发的Ajax请求:

const axios = require('axios');

async function makeConcurrentRequests() {
    const requests = [];
    for (let i = 0; i < 100; i++) {
        requests.push(
            axios.get('http://localhost', {
                params: { id: 123 }
            })
        );
    }

    try {
        const responses = await Promise.all(requests);
        console.log(responses.map(r => r.data));
    } catch (error) {
        console.error(error);
    }
}

makeConcurrentRequests();

在这个示例中,我们使用了Promise.all来并行处理所有的请求。所有请求会被同时发起,并且在所有请求完成之后才会处理响应。

需要注意的是,虽然这些请求是并发发起的,但它们并不一定按顺序完成。如果需要确保响应的顺序,可以在请求完成后对响应进行排序。

回到顶部