jQuery 增量读取 AJAX 流?

2024-01-08

我读过了这个问题 https://stackoverflow.com/questions/6093103/jquery-ajax-display-data-as-it-comes-in但它并不能完全回答我的问题。 不幸的是,自从我上次查看 AJAX 以来,XHR 对象中的情况似乎发生了变化,因此不再可能直接访问responseText在完成填充之前。

我必须编写一个页面,使用 AJAX(最好是 jQuery,但我愿意接受建议)通过 HTTP 从我无法控制的服务器检索 CSV 数据。响应数据可能非常大;一兆字节的文本并不罕见。

服务器是流友好的。还有什么方法可以直接从 JavaScript 返回数据流吗?

我确实可以选择编写一些位于中间的 PHP 代码,并使用某种“Comet”技术(长轮询、EventSource 等),但如果可能的话,我宁愿避免这种情况。

如果相关,请假设此问题的用户拥有最新版本的 Firefox/Chrome/Opera,并且旧浏览器兼容性不是问题。


输出时非常简单文本或 HTML。下面是一个例子。

(如果尝试输出,你会遇到问题JSON不过,我将进一步解决这个问题。)

PHP FILE

header('Content-type: text/html; charset=utf-8');
function output($val)
{
    echo $val;
    flush();
    ob_flush();
    usleep(500000);
}
output('Begin... (counting to 10)');
for( $i = 0 ; $i < 10 ; $i++ )
{
    output($i+1);
}
output('End...');

HTML文件

<!DOCTYPE>
<html>
    <head>
        <title>Flushed ajax test</title>
        <meta charset="UTF-8" />
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    </head>
    <body>
        <script type="text/javascript">
        var last_response_len = false;
        $.ajax('./flushed-ajax.php', {
            xhrFields: {
                onprogress: function(e)
                {
                    var this_response, response = e.currentTarget.response;
                    if(last_response_len === false)
                    {
                        this_response = response;
                        last_response_len = response.length;
                    }
                    else
                    {
                        this_response = response.substring(last_response_len);
                        last_response_len = response.length;
                    }
                    console.log(this_response);
                }
            }
        })
        .done(function(data)
        {
            console.log('Complete response = ' + data);
        })
        .fail(function(data)
        {
            console.log('Error: ', data);
        });
        console.log('Request Sent');
        </script>
    </body>
</html>

如果我需要使用 JSON 来执行此操作怎么办?

实际上不可能增量加载单个 JSON 对象(在完全加载之前),因为在获得完整的对象之前,语法将始终无效。

但如果你的回应multipleJSON 对象,一个接一个,然后可以在它们沿着管道传输时一次加载一个。

所以我调整了上面的代码...

  1. 更改 PHP FILE 第 4 行echo $val; to echo '{"name":"'.$val.'"};'。这会输出一系列 JSON 对象。

  2. 更改 HTML FILE 第 24 行console.log(this_response); to

    this_response = JSON.parse(this_response);
    console.log(this_response.name);
    

    请注意,此基本代码假设进入浏览器的每个“块”都是有效的 JSON 对象。情况并非总是如此,因为您无法预测数据包将如何到达 - 您可能需要根据分号分割字符串(或提出另一个分隔符)。

不要使用application/json

Do NOT将您的标题更改为application/json- 我这样做了,我用谷歌搜索了三天。当响应类型为application/json,浏览器等待响应完成,就像完全完成一样。然后解析完整的响应以检查它是否实际上是 JSON。然而我们的完整回应是{...};{...};{...};这不是有效的 JSON。这jqXHR.done方法假设存在错误,因为完整的响应无法解析为 JSON。

正如评论中提到的,您可以使用以下方法在客户端禁用此检查:

$.ajax(..., {dataType: "text"})

希望有些人觉得这很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery 增量读取 AJAX 流? 的相关文章

随机推荐

  • 来自 Python 的 Win32 长路径

    注意 这个问题是关于新支持的win32长路径 https superuser com questions 1119883 windows 10 enable ntfs long paths policy option missing 自 W
  • 如何确定哪个 Windows 进程是管理当前进程输出的“音频会话”?

    我碰巧在这里使用 Python 绑定 但我怀疑这个问题和最终的答案并不是 Python 特有的 在 Windows 10 上 使用Python 绑定到 Windows 的 Core Audio 库 https github com Andr
  • 限制单个 RDD 的最大并行度而不减少分区数量

    是否可以在不改变实际分区数量的情况下限制RDD级别的最大并发任务数 用例是在不减少分区数量的情况下 不要因过多的并发连接而压垮数据库 减少分区数量会导致每个分区变得更大并最终难以管理 我将其重新发布为 答案 因为我认为这可能是最不肮脏的黑客
  • 使用 MSBuild FileUpdate 任务仅更改 AssemblyInfo.cs 中的修订号

    我只需要更改版本号AssemblyInfo cs文件 版本号的格式为主要 次要 构建 修订 e g 1 4 6 0 目前我用以下命令更改版本FileUpdate任务 来自MSBuild 社区任务项目 http msbuildtasks ti
  • 将 JUNG 移植到 GWT [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有一个非常好的java图形库JUNG http jung sourceforge net 我想知道是否存在任何 GWT 库可以完成 JUN
  • 无法更新 Xcode 11 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 尝试从 Xcode 11 GM 更新到 11 1 总是失败 我首先尝试移动 Applications Xcode app 没有任何效果 这
  • 无法关闭 CFMX 8 中的持久跟踪 cookie

    CFMX 8 企业版 我已打开 内存变量 下的 使用 J2EE 会话变量 设置 因为安全要求规定不能使用持久 cookie 我知道打开此设置将告诉 CF 仅创建和使用 JSESSIONID 会话 cookie 然而 我的服务器似乎仍在创建和
  • 如何在 rxjs 管道中有条件地执行某些操作?

    有人可以告诉我带有条件操作的 rxjs 管道的正确语法是什么吗 在这种情况下 如果环境名称数组长度不为 1 我想使用过滤器进行映射 如何使用不返回的 if 语句 是否有任何 rxjs 运算符 environmentName env1 env
  • SwiftUI:ViewModifier,其中内容是图像

    我收到错误 Type PlayButtonModifier does not conform to protocol ViewModifier 我不明白为什么 更重要的是 我不明白如何正确地做到这一点 我只是尝试创建一个ViewModifi
  • MongoDB 4.x 实时同步到 ElasticSearch 6.x +

    我正在尝试找到一种简单的方法将 mongoDB 4 x 中的数据同步到 elasticsearch 6 x 我的用例是 Elasticsearch 支持但 mongodb 不支持的部分文本搜索 MongoDB 是我的应用程序的主要数据库 我
  • 使用node.js从输入中获取密码

    如何使用node js从输入中获取密码 这意味着您不应该输出在控制台中输入的密码 您可以使用read https www npmjs com package read module 披露 我写的 为了这 在你的外壳中 npm install
  • python 中的块作用域 - 与函数内部的 javascript 提升类似吗?

    我目前正在尝试理解Python中的这段代码 def foo a if a 12 var Same else var different 我阅读并理解了 python 不支持基于块的作用域这一事实 因此 函数内创建的所有内容 无论是在循环内还
  • 如何使用 Akka HTTP 表示表单数据请求?

    我想创建一个表单数据http请求脸书API https developers facebook com docs graph api video uploads使用 Akka HTTP 在curl中 请求示例如下所示 curl X POST
  • 检查数据库连接,否则显示消息

    我想检查该网站是否可以连接到 mySQL 如果没有 我想显示一个错误 指出用户应该在几分钟内尝试再次访问该页面 我真的不知道该怎么做 任何帮助将不胜感激 string mysql error resource link identifier
  • 使用 firebug 查找 JavaScript 中的内存泄漏?

    是否有适用于 Firefox 的附加组件可以用来找出部分 JavaScript 导致内存泄漏的情况 我对 Firefox 没有任何了解 但 Chrome 中的 webkit 检查器有一个内置的分析器 非常适合此类事情 作为一个额外的好处 它
  • 在Python中加载大文件

    我正在使用在 Ubuntu 9 04 上运行的 Python 2 6 2 GCC 4 3 3 我需要使用 Python 脚本逐行读取一个大数据文件 1GB gt 300 万行 我尝试了以下方法 发现它占用了很大的内存空间 3GB for l
  • 正则表达式,匹配不带“http://”和任何其他“/”的 url

    我环顾四周 但可能我无法使用正确的关键字 谷歌 所以我在这里 我需要将 url 剥离协议与第一个 相匹配 Target 匹配从 http 到第一个 可能是最后一个 不存在 或到结尾的第一个子字符串 那么问题来了 我写了这个正则表达式 但这个
  • 预定义类型“System.Runtime.CompilerServices.IsExternalInit”未定义或导入[重复]

    这个问题在这里已经有答案了 我在使用 Visual Studio 2019 Preview 测试 C 9 0 的新功能时一直遇到这个问题 我正在测试 init setter 但编译器显示错误并显示以下消息 错误 CS0518 未定义或导入预
  • 通过 Exchange EWS API 批准电子邮件

    我遇到一种情况 我需要将邮件重新路由到另一个作为主持人的邮箱 以编程方式 有没有办法批准我在主持人邮箱中收到的消息 我没有看到 EWS 对此有明确的支持 微软还有其他 API 类型支持这个吗 这不是官方批准的方式 但以下解决方法可以帮助我批
  • jQuery 增量读取 AJAX 流?

    我读过了这个问题 https stackoverflow com questions 6093103 jquery ajax display data as it comes in但它并不能完全回答我的问题 不幸的是 自从我上次查看 AJA