如何中止来自 Observable 的 Ajax 请求?

2024-01-24

我的代码包含这个简单的函数,我用它来将文件上传到我的 PHP 服务器(有一个xhr请求嵌套在RxJS/Observable):

fileUpload(file: File): Observable<any> {
    return new Observable( observer => {
        let xhr:XMLHttpRequest = new XMLHttpRequest();
        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    observer.next(<any>JSON.parse(xhr.response));
                } else {
                    observer.error(xhr.response);
                    observer.complete();
                }
            }
        };

        xhr.open('POST', '__BACKEND__?action=file-upload', true);
        var formData = new FormData();
        formData.append('file', file, file.name);
        xhr.send(formData);
    });
}

它功能齐全,但现在我还想为其添加某种取消机制。

仅仅取消订阅 Observable 是行不通的,因为我需要以某种方式调用xhr.abort()或者我会因为大量上传而浪费宝贵的资源。

是否可以通过修改此代码获得一个优雅的解决方案,或者我做错了,因为我正在使用RxJS/Observable为了这个任务?


当您创建一个Observable您可以通过返回指定取消订阅行为Subscription or a function来自构建器函数:

fileUpload(file: File): Observable<any> {
    return new Observable( observer => {
        let xhr:XMLHttpRequest = new XMLHttpRequest();
        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    observer.next(<any>JSON.parse(xhr.response));
                    observer.complete();
                } else {
                    observer.error(xhr.response);
                }
            }
        };

        xhr.open('POST', '__BACKEND__?action=file-upload', true);
        var formData = new FormData();
        formData.append('file', file, file.name);
        xhr.send(formData);

        //Return the tear down logic. 
        //You may also want to check here that it has not already completed
        //Since this gets called in all cases when the `Subscription` terminates
        return () => xhr.abort();
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何中止来自 Observable 的 Ajax 请求? 的相关文章

  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • jQuery AJAX 请求在 IE8 中失败,并显示消息“错误:调用 open 方法之前无法调用此方法。”

    我正在使用 jQuery 1 4 2 并尝试执行一个简单的 AJAX 请求 目标 URL 返回一个 JSON 字符串 我使用 jslint 对其进行了验证 该请求在 Firefox 和 Chrome 中有效 但不想在 IE8 中工作 我无法
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐

  • git pull:不断告诉我在拉取之前隐藏本地更改

    当我尝试使用 git pull 拉取我的 git 存储库时 它不断告诉我我有本地更改 尽管我没有触及任何提到的文件 有人可以解释这种行为并知道解决方案吗 git 状态 On branch master Your branch is behi
  • GlassFish 4 / EclipseLink 延迟加载 @ManyToOne 关系失败

    GlassFish 4 实际上是它的 JPA 实现 即 EclipseLink 无法从我们的 Java EE 7 应用程序延迟加载 ManyToOne JPA 关系 默认 渴望加载是可以的 但不能是延迟加载 学生 实体中的关系是 ManyT
  • 将值传递给路由

    我有一份物品清单 当用户点击某个项目时 用户将被带到项目详细信息页面 我想将包含项目详细信息 如项目的图像 URL 的对象传递给路线 但是 我不想在路由网址中公开它 如果有办法做类似的事情 a item name a 那将是黄金 我已经看到
  • 如何用vb6查询网站?

    vb6中查询网页的函数是什么 我想做的是从雅虎财经获取数据 例如 此 url 返回一个 csv 文件 其中包含通用电气的股息值 我需要在函数中运行它并让函数返回答案 说到 Excel 您可以创建网络查询 http office micros
  • 在 Mac 上更新 Python

    我想在 mac 上将 python 2 6 1 更新到 3 x 但我想知道是否可以使用终端来完成此操作 或者我必须从 python 网站下载安装程序 我问这个问题是因为安装程序没有更新我的终端 python 版本 OS X 上的默认 Pyt
  • Hibernate 导致:org.hibernate.AnnotationException:未知的mappedBy

    我有两节课 Entity Table name profil public class Profil Id GeneratedValue strategy GenerationType AUTO Column name id private
  • 将 Tensorflow 中除 max 之外的所有值归零

    我有一个数组 0 3 0 5 0 79 0 2 0 11 我想将除最大值之外的所有值转换为零 所以结果数组将是 0 0 0 79 0 0 在 Tensorflow 图中执行此操作的最佳方法是什么 如果你想保留最大值的所有出现 你可以使用 c
  • 使用 Paramiko 进行递归目录下载?

    我想通过 SSH 递归下载一个包含未知内容的目录 并一直在尝试 Paramiko 我看过几个如何上传目录的示例 但没有一个示例涵盖递归下载 我可以列出目录中的所有项目 但无法找到一种方法来了解该项目是文件 要下载 还是目录 要递归调用 tr
  • 如何在 Mac OS X 10.5 中处理 Finder 中的多个文件拖放操作?

    我需要获取从 Finder 拖 放到我的应用程序中的所有文件的 URL 我有一个在 10 6 上运行的 Cocoa 应用程序 它通过使用新的 10 6 NSPasteboard API 来处理粘贴板上的多个项目 我正在尝试将此应用程序向后移
  • Windows Phone 7、登录屏幕重定向和 .exit 案例?

    我知道这个问题已经被讨论得令人作呕 但我想介绍一下我的情况 我的应用程序中的起始页是login xaml 用户登录 用户名和密码通过我的WCF服务进行身份验证 用户名保存在独立存储中 然后用户被重定向到mainpage xaml 当用户启动
  • NSTableColumn 大小适合内容

    我正在 Mac OS X 10 6 Snow Leopard 中进行开发 当我在 NSTableView 的两个列标题之间双击时 左侧的列会自动调整大小 就像您所期望的那样 我也想在上下文菜单中提供此功能 但似乎没有可公开访问的功能来执行此
  • 将具有 is-inactive 类的元素的光标设置为默认值

    客观的 一旦选择了每个类别的最大球员人数 两名守门员 六名后卫 十二名前锋 剩余的球员picked与班级is inactive应设置为cursor default 问题的澄清 所有球员都有班级is inactive作为默认值 我想做的是尝试
  • 从浏览器地址栏执行 Javascript 方法 - GWT

    我试图通过在浏览器 URL 地址栏上执行以下命令来在我的 Web 应用程序上执行 Javascript javascript window alert test void 0 但是 什么也没有发生 警报框也没有出现 原因可能是应用程序在 D
  • 在 Firestore (NodeJS) 上的文档中设置文档引用

    我正在尝试使用 NodeJS v8 6 0 创建一个包含 Firestore 参考的文档 像这样 const admin require firebase admin admin initializeApp credential MY CR
  • 2D 和 3D 数组的动态分配/释放

    我知道动态分配 取消分配 2D 数组的算法 但是我不太确定 3D 数组的算法 利用这些知识和一点对称性 我想出了以下代码 在编码过程中我很难以 3D 形式进行可视化 请评论正确性并建议任何更好的替代方案 效率或直观 如果有 另外 我认为这些
  • iOS的睡眠功能是什么

    我正在寻找一个函数 可以让 iOS 上的 C 代码甚至 Objective C 代码的线程进入休眠状态 我的编译器无法识别 sleep 0 Thanks 阻止 0 5 秒 NSThread sleepForTimeInterval 5
  • 从 R 中的大型 .CSV 导入和提取随机样本

    我正在 R 中进行一些分析 需要处理一些大型数据集 10 20GB 存储在 csv 中 并使用 read csv 函数 由于我还需要将大型 csv 文件与其他数据帧合并和转换 因此我没有计算能力或内存来导入整个文件 我想知道是否有人知道导入
  • 使用 C# 驱动程序将 UDT 元素添加到 Cassandra 中的列表集合的正确方法是什么?

    我有一个 UDT 列表 例如 create table MyTable stuff list
  • 将嵌入的 Pod 打印为带 termcap 转义的格式化文本

    我正在尝试将嵌入式 Pod 作为 ANSI 文本输出到终端 在 Perl 5 中我可以使用Pod Text Termcap https metacpan org pod Pod Text Termcap use strict use war
  • 如何中止来自 Observable 的 Ajax 请求?

    我的代码包含这个简单的函数 我用它来将文件上传到我的 PHP 服务器 有一个xhr请求嵌套在RxJS Observable fileUpload file File Observable