等待多个Promise被拒绝

2023-12-04

进行一些测试时,我需要等待几个承诺被拒绝。

我知道我可以使用 jQuery.when() 来等待几个承诺得到解决。但是,一旦其中一个承诺失败,该方法就会拒绝主承诺。

我知道我所有的承诺都会落空,但无论如何我还是需要等待。我该怎么做?

在一种伪代码中我想做的是:

var promise1 = connection.doCall();
var promise2 = connection.doCall();

$.when([promise1, promise2]).allOfThemFail(function() {
    assertThatSomeProcessWasDoneOnlyOnce()
});

使用 Bluebird Promise 库,您可以使用Promise.settle()它等待所有承诺都被解决(例如履行或拒绝),然后您可以简单地查询列表以查看它们是否全部被拒绝。

var p1 = connection.doCall();
var p2 = connection.doCall();
Promise.settle([p1, p2]).then(function(results) {
    var allRejected = results.every(function(item) {
        return item.isRejected();
    });
    // act on allRejected here
});

这是 jQuery 特定版本settle():

(function() {    

    function isPromise(p) {
        return p && (typeof p === "object" || typeof p === "function") && typeof p.then === "function";
    }

    function wrapInPromise(p) {
        if (!isPromise(p)) {
            p = $.Deferred().resolve(p);
        }
        return p;
    }

    function PromiseInspection(fulfilled, val) {
        return {
            isFulfilled: function() {
                return fulfilled;
            }, isRejected: function() {
                return !fulfilled;
            }, isPending: function() {
                // PromiseInspection objects created here are never pending
                return false;
            }, value: function() {
                if (!fulfilled) {
                    throw new Error("Can't call .value() on a promise that is not fulfilled");
                }
                return val;
            }, reason: function() {
                if (fulfilled) {
                    throw new Error("Can't call .reason() on a promise that is fulfilled");
                }
                return val;
            }
        };
    }

    // pass either multiple promises as separate arguments or an array of promises
    $.settle = function(p1) {
        var args;
        if (Array.isArray(p1)) {
              args = p1;
        } else {
            args = Array.prototype.slice.call(arguments);
        }

        return $.when.apply($, args.map(function(p) {
            // make sure p is a promise (it could be just a value)
            p = wrapInPromise(p);
            // Now we know for sure that p is a promise
            // Make sure that the returned promise here is always resolved with a PromiseInspection object, never rejected
            return p.then(function(val) {
                return new PromiseInspection(true, val);
            }, function(reason) {
                // convert rejected promise into resolved promise by returning a resolved promised
                // One could just return the promiseInspection object directly if jQuery was
                // Promise spec compliant, but jQuery 1.x and 2.x are not so we have to take this extra step
                return wrapInPromise(new PromiseInspection(false, reason));
            });
        })).then(function() {
              // return an array of results which is just more convenient to work with
              // than the separate arguments that $.when() would normally return
            return Array.prototype.slice.call(arguments);
        });
    }

})();

并且,您可以像 Bluebird 解决方案一样使用它:

var p1 = connection.doCall();
var p2 = connection.doCall();
$.settle([p1, p2]).then(function(results) {
    var allRejected = results.every(function(item) {
        return item.isRejected();
    });
    // act on allRejected here
});

而且,这是一个settle()使用标准 ES6 Promise 从头开始​​构建类型函数。它返回一个承诺,当所有其他承诺完成后(无论其最终状态如何),该承诺就会得到解决。这个超级承诺的解决结果是一个数组PromiseInspection您可以查询的对象isFulfilled() or isRejected()并可以获得.value() or .reason().

Promise.isPromise = function(p) {
    return p && (typeof p === "object" || typeof p === "function") && typeof p.then === "function";
}

// ES6 version of settle
Promise.settle = function(promises) {
    function PromiseInspection(fulfilled, val) {
        return {
            isFulfilled: function() {
                return fulfilled;
            }, isRejected: function() {
                return !fulfilled;
            }, isPending: function() {
                // PromiseInspection objects created here are never pending
                return false;
            }, value: function() {
                if (!fulfilled) {
                    throw new Error("Can't call .value() on a promise that is not fulfilled");
                }
                return val;
            }, reason: function() {
                if (fulfilled) {
                    throw new Error("Can't call .reason() on a promise that is fulfilled");
                }
                return val;
            }
        };
    }

    return Promise.all(promises.map(function(p) {
        // make sure any values are wrapped in a promise
        if (!Promise.isPromise(p)) {
            p = Promise.resolve(p);
        }
        return p.then(function(val) {
            return new PromiseInspection(true, val);
        }, function(err) {
            return new PromiseInspection(false, val);
        });
    }));
}

并且,您可以像上面一样使用它:

var p1 = connection.doCall();
var p2 = connection.doCall();
Promise.settle([p1, p2]).then(function(results) {
    var allRejected = results.every(function(item) {
        return item.isRejected();
    });
    // act on allRejected here
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待多个Promise被拒绝 的相关文章

  • 使用 Angular 指令禁用文本选择

    我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • JQuery UI Selectable 插件:当 div 溢出时使滚动条不可选择

    我有一个 div 设置为overflow auto 该 div 的内容是可选择的 使用 jQuery UI 当 div 溢出并出现滚动条时 滚动条本身变为可选择状态 因此滚动效果不佳 在 FF Chrome 中 我可以滚动 div 但我得到
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 将基于Box的树结构适配为Rc+RefCell时如何处理“临时值丢失”错误?

    我创建了一个树 其类型定义类似于 derive Debug Clone pub crate struct TreeBox
  • 配置 gvim 设置颜色和字体

    我想尝试一下 vim 但是配置文件有点问题 我这里已经安装了gvimC Program Files x86 Vim vim73并添加了一个名为C Program Files x86 Vim vim73 vimrc 但是当我尝试不同的配置时
  • 通过 FTP 将文件发送到服务器,但结果到达时字节大小为零

    我正在尝试使用 FTPClient 将文件上传到数据库服务器 显示文件传输成功 但文件为空 大小为0字节 下面是我用来构建的源代码 有人能解决这个问题吗 package Examples import org apache commons
  • 如何在 JOIN 的 WHERE 子句中使用列名作为 LIKE 语句的一部分

    LEFT OUTER JOIN INVENTTRANS ON TEMP VOUCHERPHYSICAL INVENTTRANS VOUCHERPHYSICAL WHERE INVENTTRANS ITEMID Temp INVENTDIMI
  • Logstash 文件输入:sincedb_path

    重新启动 Logstash 后 有时会观察到 Logstash 会重复日志事件 想知道什么是正确的申请方式start position sincedb path sincedb write interval配置选项 当同一位置有多个文件时会
  • 立即将图像加载到内存中

    我需要将 WPF 中的 Tiff 图像中的所有帧打开到内存中 然后删除源 之后我最终需要渲染该图像 根据窗口大小调整大小 我的解决方案非常慢 我无法在第一次请求之前删除文件源 有什么最佳实践吗 Use CacheOption BitmapC
  • Python/格式 - 列表和宽度

    到目前为止 我的列表的格式是这样的 print gt 15 gt 15 gt 15 gt 15 format i liste l 我对 python 很陌生 我不知道如何通过动态设置动态宽度 我的意思是 len total int len
  • 如何按起始字符范围进行选择?

    这是我的 mySQL 查询 SELECT FROM eodList WHERE datechanged gt curdate GROUP BY symbolName ORDER BY dateChanged DESC 我如何获取所有行 例如
  • MySQL JOIN 和 COUNT 在单个查询中

    我正在尝试将两个表连接在一起并获取外键的计数 抱歉 我真的不知道如何解释自己 所以让我演示一下 我有 1 个表 订单 用于订单 包含以下字段 id f name l name credit card ETC 然后 我有一个订单中的项目的 o
  • 确定一个符号是否是第 i 个组合 nCr 的一部分

    更新 组合学和取消排名最终是我所需要的 下面的链接有很大帮助 http msdn microsoft com en us library aa289166 v vs 71 aspx http www codeproject com Arti
  • 如何为 Google Cloud Function 分配内存?

    今天我在云函数中遇到这个错误 函数被杀死 错误 超出内存限制 我的功能是基于经过身份验证的 json api 示例Firebase 示例函数 因为它工作起来就像一个魅力 我用多个路由和多个任务扩展了它 比如连接多个外部 api 将 base
  • JTable刷新不显示

    我拼命地试图说服我的JTable当我更改其数据时刷新 数据存储在全局单例中 TreeSet 我正在使用 每当TreeSets 数据被更改 会触发一个事件来刷新TableModel 出于测试目的 我将其替换为一个简单的Timer射击事件 每次
  • 无法从数据源获取单元格

    下面的代码有什么问题 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexPath indexPath NSString CellIden
  • 使用 cout 打印正确的小数位数

    我有一个清单float值 我想打印它们cout保留 2 位小数 例如 10 900 should be printed as 10 90 1 000 should be printed as 1 00 122 345 should be p
  • 我无法删除使用苹果登录的用户

    我们正在实施新的指导方针Apple 强制要求删除用户 我正在使用 firebase 进行身份验证 我正在创建一个用户帐户 这里没问题 但我无法删除使用苹果登录的用户 我收到错误 我正在使用这个api来删除 令牌撤销API 我是快速的新手 我
  • 首次未加载带有毕加索的地图标记点图像

    我正在使用自定义标记实现 android Mapview 我正在使用毕加索将图像加载到标记视图中 当我第一次启动该应用程序时 它会向我显示所有标记 但只有一个标记是使用 picasso 从数据库加载的 其他标记不会从数据库加载 它们只向我显
  • 如何对 DataGridView 列进行排序?

    我创建了一个数据表 如下所示 accTable new DataTable accTable Columns Add new DataColumn Date accTable Columns Add new DataColumn Amt a
  • 防止 JavaScript window.getSelection() 循环引用

    请参阅此演示 取决于目前仅在 Chrome 中有效的选择更改事件 http jsfiddle net fyG3H 选择一些 lorem ipsum 文本 然后聚焦文本输入 在控制台日志中 您将看到有一个 DOMSelection 对象 它的
  • 验证结束日期等于大于开始日期

    我想使用 jquery validate 检查结束日期是否大于或等于开始日期 它验证结束日期大于开始日期 但不允许结束日期等于开始日期 这是我的代码 jQuery validator addMethod greaterThan functi
  • 等待多个Promise被拒绝

    进行一些测试时 我需要等待几个承诺被拒绝 我知道我可以使用 jQuery when 来等待几个承诺得到解决 但是 一旦其中一个承诺失败 该方法就会拒绝主承诺 我知道我所有的承诺都会落空 但无论如何我还是需要等待 我该怎么做 在一种伪代码中我