第一个承诺完成后,Angular $q.all 被调用

2024-03-25

我试图使用 $q.all 等待所有承诺都得到解决,但它是在第一个承诺完成后调用的!

我做错了什么?

function sendAudits(audits) {
    var promises = [];

    $scope.sendAudits = {
        progress: 0
    };
    angular.forEach(audits, function (audit, idAudit) {
        promises.push(saveAudit(audit));
    });

    $q
        .all(promises)
        .then(function (data) {
            console.log(data);
        }, function (errors) {
            console.log(errors);
        });
}

function saveAudit(audit) {
    var filename = audit.header.id + ".txt";

    return $http({
        method: 'PUT',
        url: '/audits/audits.php?filename=' + encodeURIComponent(filename),
        data: AuditSvc.getPlainAudit(audit.header.id)
    }).finally(function () {
        $scope.sendAudits.progress += 1;
        console.log("FINALLY: " + audit.header.id);
    });
}

EDIT

稍微深入分析一下问题,当某些响应有错误时,就会出现这种情况。例如当服务器返回时header("HTTP/1.0 418 I'm A Teapot: " . $filename);,客户端控制台将类似于:

PUT http://localhost:8182/audits/audits.php?filename=1.txt 418 (I'm A Teapot: 1.txt)
FINALLY: 1
Object {data: "", status: 418, config: Object, statusText: "I'm A Teapot: 1.txt"}
PUT http://localhost:8182/audits/audits.php?filename=2.txt 418 (I'm A Teapot: 2.txt)
FINALLY: 2
PUT http://localhost:8182/audits/audits.php?filename=3.txt 418 (I'm A Teapot: 3.txt)
FINALLY: 3
PUT http://localhost:8182/audits/audits.php?filename=4.txt 418 (I'm A Teapot: 4.txt)
FINALLY: 4

$q.all is 没有弹性

正如其他人指出的那样,$q.all is 没有弹性。如果其中一项承诺被拒绝,$q.all因第一个错误而被拒绝。

创建一个有弹性的复合承诺,即等待所有承诺完成通过或失败的承诺,使用.catch对每个人的承诺convert被拒绝的承诺到成功的承诺。

var resilientPromises = [];

angular.forEach(promises, function(p) {
    var resilientP = p.catch( function(result) {
        //return to convert rejection to success
        return result;
    });
    resilientPromises.push(resilientP);
});

$q.all(resilientPromises).then( function (results) {
    //process results
});

从这个答案中可以看出两点:

  1. A $q.all承诺是没有弹性。它被第一个拒绝的 Promise 拒绝。
  2. 可以通过拒绝的 Promise 创建已履行的 Promise返回onRejected 函数的值.then方法或.catch method.

有关更多信息,请参阅你错过了承诺的重点 https://blog.domenic.me/youre-missing-the-point-of-promises/

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

第一个承诺完成后,Angular $q.all 被调用 的相关文章

随机推荐

  • 使用backbone.js处理belongs_to关系

    我对backbone js有点陌生 我正在努力获取具有belong to关系的集合 我想获取用户列表 users GET 并且我想显示所有用户 但带有belongs to关联 例如显示用户的公司名称 有人知道解决办法吗 我正在将 Ruby
  • 在 jupyter 上安装 gnuplot

    我想用 gnuplot 绘制条形图 但我安装时遇到问题 我正在使用 jupyter anaconda 以下代码不适用于安装 conda install gnuplot py pip install gnuplot py pip instal
  • CSS/JS 中的动态 URL

    我正在拆分我的一个较大的应用程序 并引入一个 cdn url 来容纳 CSS javascript 和图像等常见对象 以避免重复 不过 我需要做的是为我们的开发环境提供单独的 URL 因此我可能有 http cdn dev example
  • 将数据 URI 转换为图像数据

    Converts data URI in image png format to an image data object param dataURL Base64 encoded string returns ImageData unde
  • 为什么 gcc 允许使用大于数组的字符串文字初始化 char 数组?

    int main char a 7 Network return 0 A 字符串字面量在 C 中是内部终止的空字符 因此 上面的代码应该给出编译错误 因为字符串文字的实际长度Network是 8 并且它不能放入char 7 array 然而
  • 使用具有 SAML 2 的 Identity Server 与其他身份提供商进行 SSO

    我使用 Identity server 4 和 OIDC 实现了身份验证和授权 以允许访问我们的应用程序的客户端获取访问我们的资源服务器 Web API 所需的令牌 这是当前的架构 Identity Server 4 使用我的自定义数据库对
  • JPA 按两个日期之间的日期查找

    在这里 我尝试使用 JPA 从 MYSQL DB 获取数据 但我在设置数据对象来处理条件时遇到麻烦 据我所知 我必须创建数据对象来处理它 我如何创建日期对象来处理需要的 这是我的正常查询 select t id t MSISDN t Par
  • Ruby on Rails:如何在 Windows 上后台自动启动 WEBrick 服务器?

    为了在 Windows XP 上运行我的 Rails 应用程序 我打开命令行 cd 到应用程序的目录 然后运行rails server 我想自动化此操作 这样每次我打开计算机时 我所要做的就是输入localhost 3000在浏览器中 我怎
  • 使用 Python JSON 序列化类并更改属性大小写

    我想创建一个类的 JSON 表示形式并自动更改属性名称snake case to lowerCamelCase 因为我想遵守 Python 中的 PEP8 以及 JavaScript 命名约定 也许更重要的是 我正在与之通信的后端使用low
  • 使用 AUGraph 播放麦克风的声音

    当我使用AUGraph实现麦克风播放声音时 我有一个问题 在设备 iphone 3g 中 我只能从耳机的右侧听到 但在模拟器中效果很好 我可以从耳机的两侧听到声音 这是我用来将输入连接到输出的代码 AUGraphConnectNodeInp
  • jsonschema2pojo 中的 JSR-303 激活

    有一个地方在jsonschema2pojo描述启用可能性的文档JSR 303注释生成 https github com joelittlejohn jsonschema2pojo wiki Reference minimummaximum
  • Android中加载数据到TextView

    我有一个像 Yes No Dontknow 这样的 XML 标签 我正在解析 XML 文件并获取数据 现在我需要在单独的 TextView 中显示每个选项 即 是 应显示在一个 TextView 中 否 应显示在另一个 TextView 中
  • C# 构造函数之外的对象构造

    当涉及到设计类以及它们之间的 通信 时 我总是尝试以所有对象构造和组合都在对象构造函数中进行的方式进行设计 我不喜欢从外部进行对象构造和组合的想法 就像其他对象设置属性并调用我的对象上的方法来初始化它一样 当多个对象尝试对您的对象执行此操作
  • 通过javascript选择特定打印机

    我的计算机连接了两台打印机 我可以通过 JavaScript 代码选择特定的打印机吗 无法绕过打印选项 默认打印机由访问者操作系统决定 使用普通的旧 JavaScript 对此无能为力 使用 Flash 或 Java 或许可以实现这一点 但
  • css/ html 帮助制作像容器一样的圆桌

    任何人都可以提供如何创建基于 css 的气泡容器以便 html 进入其中的见解或示例吗 我想做一张圆桌 也就是说 我希望结果看起来像一张桌子 但边缘是圆角的 如果内部也有轻微的梯度就太好了 我在这个网站上找到了一个样本 http www s
  • 使用R中的geom_smooth()在ggplot2图例中混合填充颜色

    使用绘制两条回归曲线时geom smooth in ggplot2 为了fill颜色 图例选择置信区间相交的颜色 我确实认为当重叠区域按比例大于另一个区域时就会出现这种行为 但是我发现这是非常不受欢迎的 因为读者能够推断出 变暗 区域是 C
  • 有条件地填充 voronoi 段/颜色

    我正在尝试根据 d lon 值有条件地为这些 voronoi 段着色 如果是正数 我希望它是绿色的 如果是负数 我希望它是红色的 然而目前它正在将每个段返回为绿色 即使我将 它仍然返回绿色 活生生的例子在这里 https allaffect
  • Visual Studio 2010 是否支持 Sharepoint 2007 开发?

    我注意到在 VS2010 beta 2 中 所有模板仅适用于 Sharepoint 2010 这是真的 如果是这样 VIeWS 1 3 至少可以与 VS2010 一起使用吗 据我记得在 SharePoint 拉斯维加斯会议上的会议 新的 很
  • 如何在 C# 中使用 itextsharp 创建带有泰米尔字体的 PDF 文件?

    我们正在 C 应用程序中通过传递泰米尔语文本 印度语言之一 来创建 pdf 文件 因此 我已经为我的泰米尔语字体安装了 AVVAIYAR TTF 泰米尔语字体之一 字体 但是当我运行下面提到的命令时pgm 创建的pdf文件不包含任何泰米尔字
  • 第一个承诺完成后,Angular $q.all 被调用

    我试图使用 q all 等待所有承诺都得到解决 但它是在第一个承诺完成后调用的 我做错了什么 function sendAudits audits var promises scope sendAudits progress 0 angul