如何中止来自 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 请求? 的相关文章

随机推荐

  • 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