为 jQuery 延迟对象提供默认的“失败”方法

2023-12-26

我正在使用 jQuery 编写一个 Javascript API 客户端。我的顶级请求方法如下所示:

function request(method, uri, params, proxies) {
  var deferred = $.Deferred();
  $.ajax({
    data: method == 'GET' ? params : JSON.stringify(params),
    contentType: 'application/json',
    dataType: 'json',
    url: api.root + uri,
    type: method,
    xhrFields: {
      withCredentials: true
    }
  }).done(function(body) {
    deferred.resolveWith(this, [body.data]);
  }).fail(function(xhr) {
    deferred.rejectWith(this, [xhr]);
  });

  return deferred.promise();
},

我怎样才能有默认值fail我退回的延期的处理程序?也就是说,如果 deferred 没有附加任何其他处理程序fail条件,调用默认处理程序。

我想这样做是为了在我的应用程序中进行全局异常处理,除了具有特定处理的部分(并将定义自己的异常处理)fail延迟处理程序)。


因此,截至 2016 年,在 API 中使用 jQuery ajax 最简洁的方法是返回一个 Promise。但是,您无法确定调用者是否已将错误处理程序附加到 Promise。

因此,我建议您只需向函数添加一个新参数,告诉函数不要应用默认错误处理,因为调用者将负责错误处理。而且,我建议您通过使用现有的承诺来避免承诺反模式$.ajax()已经返回而不是创建您自己的延迟:

function request(method, uri, params, proxies, skipDefaultErrorHandling){
    // default error handling will be used if nothing is passed
    // for skipDefaultErrorHandling
    var p = $.ajax({
        data: method=='GET'?params:JSON.stringify(params),
        contentType: 'application/json',
        dataType: 'json',
        url:  api.root + uri,
        type: method,
        xhrFields: {
            withCredentials: true
        }
    });
    if (!skipDefaultErrorHandling) {
       // apply default error handling
       p = p.then(null, function(jqXHR, textStatus, errorThrown) {
           // put here whatever you want the default error handling to be
           // then return the rejection with the various error parameters available
           return $.Deferred().reject([jqXHR, textStatus, errorThrown]);
       });
    }

    return p;
};

然后,调用者只需决定是否应用自己的错误处理:

request(...).then(function(data) {
    // success code here
});

或者,你可以不做任何承诺failHandler您传入的回调和您的默认错误处理会查看是否failHandler是否通过。这是承诺和回调的混合体,不是我通常会选择构建的东西,但由于你的问题要求的是承诺不支持的东西,这是实现这一点的方法之一:

function request(method, uri, params, proxies, failHandler){
    // default error handling will be used if nothing is passed
    // for skipDefaultErrorHandling
    var p = $.ajax({
        data: method=='GET'?params:JSON.stringify(params),
        contentType: 'application/json',
        dataType: 'json',
        url:  api.root + uri,
        type: method,
        xhrFields: {
            withCredentials: true
        }
    });
    // apply default error handling
    p = p.then(null, function(jqXHR, textStatus, errorThrown) {
       if (failHandler) {
           // call passed in error handling
           failHandler.apply(this, arguments);
       } else {
           // do your default error handling here
       }
       // then keep the promise rejected so the caller doesn't think it
       // succeeded when it actually failed
       return $.Deferred().reject([jqXHR, textStatus, errorThrown]);
    });

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

为 jQuery 延迟对象提供默认的“失败”方法 的相关文章

  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • jQuery 可以在用户输入数字时添加逗号吗?

    当用户输入数字时 如何动态添加逗号 有没有一个好的数字格式化程序可以提供帮助 我必须稍后添加这些数字 所以我最终必须删除一行中的逗号 但屏幕需要显示逗号以提高可读性 运行代码片段以查看其工作情况 input number keyup fun
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • jquery从变量中删除html元素

    我将 html 保存在变量中 var itinerary events today html 我有很多 html 和一个按钮我想删除 它的 ID 为 myButton 如何从变量中保存的 html 中删除它 我建议这种方法 var itin
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 如何在react-native中获取Text组件的onPress值

    我是一名新的 React Native 开发人员 我想使用 onPress 获取 Text 组件的值并将其传递给函数
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • 将 UITabBarController 与 UINavigationController 结合起来

    我尝试使用带有导航栏的 选项卡式应用程序 默认情况下 选项卡栏工作正常 但我只是无法获得导航栏 我发现了一些关于推动导航栏之类的东西 但我发现的所有东西都是几年前的 所以不要帮助我 而且最近的东西已经过时了 自从iOS5和新版本的Xcode
  • matplotlib 中共享轴方形子图的新 pythonic 风格?

    相关 在 matplotlib 中绘制具有固定限制的自动缩放子图 https stackoverflow com questions 13612610 plotting autoscaled subplots with fixed limi
  • 跟踪电子邮件以真实图像打开

    我正在考虑将电子邮件跟踪添加到我为小型客户企业构建的网络服务中 我打算做嵌入式图像解决方案 参考我服务器上的图像 除非其他人有更好的方法 但是当我使用图像标签引用服务器上的 PHP 页面时 它会加载 损坏的图像 图标 我怎样才能使它成为有效
  • 如何在material-ui中使用伪选择器?

    我一直在努力实现简单的事情 我试图显示 隐藏我的
  • 在 Xcode 4 中将项目添加到工作区时出现问题

    我前段时间在 Xcode 3 2 x 下启动了几个项目 几天前我切换到 Xcode 4 并希望将工作区功能用作这两个项目 基本上 我的计划是从两个项目中提取一些共同的功能 并使它们成为两个项目所依赖的公共库 然而 在我接触到棘手的依赖关系之
  • 如何在 Angular 中注册触摸移动事件?

    总结一下问题 堆栈闪电战 https stackblitz com edit angular touch playground https stackblitz com edit angular touch playground 我正在尝试
  • SQL Server NText 字段限制为 43,679 个字符?

    我使用 SQL Server 数据库来存储很长的 Unicode 字符串 该字段来自 ntext 类型 理论上应限制为 2 30 个 Unicode 字符 From MSDN 文档 https msdn microsoft com en u
  • nginx:将所有请求发送到单个html页面

    使用 nginx 我想保留 url 但无论如何实际上都会加载相同的页面 我将使用该网址History getState 在我的 javascript 应用程序中路由请求 看起来这应该是一件很简单的事情吧 location rewrite b
  • 重定向弹出窗口并发布消息

    我陷入了一个问题 我必须从弹出窗口重定向到不同的域并向其发布消息 这是场景 用户打开一个新的弹出窗口 该窗口位于同一域中 例如 http doamin one com http doamin one com 用户在弹出窗口中填写表格并单击提
  • 当程序有命令行参数时,如何使用 GDB 分析程序的核心转储文件?

    我的程序是这样运行的 exe p param1 i param2 o param3 它崩溃并生成一个核心转储文件 core pid 我想通过以下方式分析核心转储文件 gdb exe p param1 i param2 o param3 co
  • 如何将 i18n 用于一种语言 cakephp

    我如何设置 i18n 才能翻译成西班牙语 我不希望用户更改应用程序上的语言 所以我只需要用户以西班牙语查看该应用程序 我认为不需要任何路由 我是对的吗 如果您的网站只有一种语言 只需将西班牙语文本直接写入需要的视图文件中即可 无需加倍工作
  • 在 Dockerfile 中如何从网络驱动器复制文件

    我在以下位置托管了一个文件 无法更改 somenetwork somefiles myfile In my Dockerfile我想 COPY somenetwork somefiles myfile opt files file 有没有办
  • 如何以编程方式(在运行时)滑动 RecyclerView 的一行?

    我有一个 RecyclerView 里面有这样的项目 I use ItemTouchHelper SimpleCallback监听 swipe 和 onChildDraw 以在项目被滑动时绘制画布 再多滑动一下 我的问题 我想仅在项目列表中
  • gtk_box_pack_start 和 gtk_container_add 有什么区别?

    在我看来 这两个函数都可以用来向容器添加一些小部件 有什么不同 gtk pack start让您可以更好地控制子窗口小部件如何分配空间 您可以控制子窗口小部件是否 扩展 分配任何额外空间 填充 使用所有分配的空间或仅使用它们请求的最小空间
  • JavaScript - 将带有方法的对象保存为字符串

    我一直在寻找一种方法来做到这一点 但似乎找不到任何东西 我有不同的配置对象 我需要将它们保存为变量中的文本以便稍后进行处理 这里是一个示例 object args config config next null final delimite
  • 阅读此 XML 的好方法是什么?

    阅读此 XML 的好方法是什么 或者也许我可以以不同的方式构建 XML 我想要的是流程成为主要内容 然后您可以遵循任意数量的相关流程
  • 如何阻止 favicon.ico 请求?

    我没有 favicon ico 但我的浏览器总是发出请求 是否可以阻止浏览器从我的网站发出对网站图标的请求 也许 HTML 标头中有一些元标记 我首先要说的是 在网页中拥有网站图标是一件好事 通常 然而 这并不总是理想的 有时开发人员需要一
  • 错误:(gcloud.services.enable)用户无权访问项目(或者可能不存在):调用者没有权限

    我希望编写一个可以从 Cloud Shell 运行的脚本 以便在所有项目中启用 API 它正在成功地完成每个项目 但我收到每个项目都被拒绝的消息 我是所有者 所以不应该有任何许可问题 作为权限测试 如果我仅运行 gcloud service
  • C++三元运算符执行条件

    我不确定 C C 三元运算符的执行保证 例如 如果给我一个地址和一个布尔值来判断该地址是否适合读取 我可以使用 if else 轻松避免读取错误 int foo const bool addressGood const int ptr if
  • 为 jQuery 延迟对象提供默认的“失败”方法

    我正在使用 jQuery 编写一个 Javascript API 客户端 我的顶级请求方法如下所示 function request method uri params proxies var deferred Deferred ajax