当前位置: 首页 > 知识库问答 >
问题:

相当于jQuery.when,它允许失败

庄实
2023-03-14

我发现,当我的多个请求都成功时,它们可以正常工作,但是如果其中一个请求因任何原因失败,我的回调就不会执行。我查了jQuery留档,上面写着

在将多个延迟对象传递给jQuery.when()的情况下,该方法从一个新的“主”延迟对象返回promise,该对象跟踪已传递的所有延迟的聚合状态。当所有延迟被解决时,该方法将立即解决其主延迟,或者当其中一个延迟被拒绝时,该方法将立即拒绝该主延迟

这意味着如果我提交n请求,并且它们都成功了,主对象将触发成功解析,并且连接的回调(使用。然后完成)将触发。但是,如果这些n请求中的任何一个失败,主promise将被拒绝,并且我将在其他子项目可能仍在工作时调用failCallback。此外,除非我使用闭包,否则我将无法访问回调中的那些子脚本。

在jQuery中提交多个ajax请求的正确方法是什么,并且无论其中任何一个请求是否失败都具有相同的行为?


共有2个答案

应俊爽
2023-03-14

听起来,不管单个请求是否失败,您都希望返回成功(假设您也将单独处理此请求)。因此,一个快速的建议是,如果您已经考虑过这一点,请原谅我,将您的AJAX调用包装为try{}catk{}块,为了防止终端故障内时()像:

    var ajax1 = function () { //do ajax stuff but return "success" on err
    var ajax2 = function () { //do ajax stuff but return "success" on err 
    
    $.when(ajax1, ajax2).then(doMoreStuff);

在ajax函数中添加如下内容:

    var ajax1 = function () {
        try {
            $.ajax(function () { 
                success: function(res){ //do stuff}
            });
        } catch () {
            //do nothing, I believe this will return an ok
        }
    }

或者,另一种方法:

$.ajax(function () { 
    success: function(){}, 
    error: function () {
        //handle the error 
        return success; 
});

假设您可以填写空白,这几乎是演示概念的伪代码。

希望有帮助!

回应你的评论。我的想法是:

var promise1 = new Promise( function(resolve, reject) {
    $.ajax ({
        success: function () { 
            //do stuff
            resolve("success");
       },
        error: function () { 
            //address your issue
            resolve("success");
    });
});

$.when(promise1, promise2, ...);

我在原始示例中添加了一个try-catch。

仇承志
2023-03-14

一开始我并没有建议这样做,因为看起来您正在处理可以单独列出的promise/延期,但是使用$.apply()可能会起作用。这将“单独”运行数组中的所有项。

var promiseArray = [ajax1, ajax2, ...];
$.when.apply($, promiseArray).then(function() { //do the final stuff }

它应该运行所有这些函数并运行.then(),即使其中一个函数有问题。

 类似资料:
  • 问题内容: 我最近重新创建一个版本的月球着陆器在Python 3和pygame的(要知道,老复古游戏):我的着陆器移动()一起由于重力的y轴每一帧\。 问题: 在我达到1 m / s之前,添加到rect.move的y值是一个小于1的浮点数,因为pygame不喜欢浮点数,所以我必须使用它对它进行四舍五入。 在Tkinter的先前版本中,着陆器的y坐标是这样的: 在pygame中 这真的很烦人,因为运

  • 问题内容: 我正在尝试使用触发两个请求,然后在两个请求完成后调用一些函数。这是我的代码: 但是,这没有按预期方式工作。Ajax调用将返回要在其中使用的数据,而Ajax调用将返回要分配给var count并随后在中使用的count 。 但是,当我启动上面的代码时,先被调用,然后再将数据保留为as 。我如何才能做到这一点,据我所知,只有当两个返回的函数都执行时,才能进行。我希望两个ajax调用都应该并

  • 为什么应用程序在安装过程中不请求使用摄像头的许可? 舱单:

  • 我用Spring靴和Spring安全。 我这样添加基于url的安全性 有没有办法只授权get、post、put…在url上担任某些角色?

  • 问题内容: 我有这个装饰器: 该代码仅能在linux上执行任何操作,就像在Windows上一样。在Windows中也可以使用此代码的最简单方法是什么? 问题答案: 它不是很漂亮,但是我不得不以跨平台的方式做类似的事情,于是我想到了使用单独的线程。基于信号的系统无法在所有平台上可靠地工作。 此类的使用可以包装在装饰器中,也可以制成上下文处理程序。 YMMV。

  • 问题内容: 我们曾经声明要在类之间传递数据,如下所示: 现在没有类,如何在类之间传递数据? 问题答案: Swift不区分属性和实例变量(即属性的基础存储)。要定义属性,只需在类的上下文中声明一个变量。 swift类只是ClassName.swift文件。 您将一个类和属性声明为 您可以通过点表示法访问属性值。作为Xcode6测试4的,也有访问修饰符(,并在SWIFT)。默认情况下,每个属性都是。有