$q.reject 和处理 AngularJS 链式承诺中的错误

2023-11-26

我无法理解使用链接承诺进行错误处理的基本概念。 为了学习规则,我写了一个简单的例子,猜测结果会是什么。但不幸的是,它的行为并不像我想象的那样。 我已经阅读了多篇有关该主题的文章,但由于我的英语水平不佳,我可能无法获得详细信息。

无论如何,这是我的代码:

    var promiseStart = $q.when("start");
    var promise1 = promiseStart.then(function() {
            return Serviceforpromise1.get();
    });
    var promise2 = promise1.then(function(data1)
    {
            return Serviceforpromise2.get(data1);
    },function(error)
    {
            return $q.reject();
    });
    var promiseend = promise2.then(function(data2)
    {
            return data2;
    },function(error)
    {
            return error;
    });
    return promiseend;

嗯,我知道它可以更好地编码,但这只是为了目的。 这是 Serviceforpromise1 函数的代码:

    function Serviceforpromise1()
    {
            ...
            return $http.get(*whatever*).then(function (data){
                return data;
            },function(error)
            {
                return $q.reject();
            });
    }

仅考虑Serviceforpromise1 失败的情况。 A$q.reject 被发送回主链,所以我正在等待“的错误回调”承诺1.然后(” 被调用并且它按预期工作。我决定将示例中的错误转移到“承诺2.然后“所以在这个错误回调中我添加了这一行返回 $q.reject(); 但它从未到达第二个错误回调(“承诺2.然后“一)我不明白为什么(比如 Serviceforpromise1,我返回了一个被拒绝的承诺!)

我很乐意深入了解这里发生的事情。 感谢您的帮助。


您的理解是正确的,问题似乎出在您试图观察这种行为的方式中的某个地方(在您没有向我们展示的东西中)。

如果您返回拒绝的承诺either成功或错误处理程序then(),然后返回的承诺then()将决心拒绝承诺。观察:

angular.module('app', [])
    .controller('C', [
    '$q',

function ($q) {
    var promiseStart = $q.when("start");
    var promise1 = promiseStart.then(function (value) {
        console.log('Got a value:', value);
        return $q.reject('Error!');
    });

    var promise2 = promise1.then(function (data1) {
        return "Got some stuff";
    }, function (error) {
        console.log("Caught an error:", error);
        return $q.reject('New error');
    });

    var promiseend = promise2.then(function (data2) {
        return data2;
    }, function (error) {
        console.log('Caught an error:', error);  // <-- this is logged to the console
        return error;
    });

    return promiseend;
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script>
<div ng-app='app' ng-controller='C'></div>

这里需要注意的一件事是,在最后一个处理程序中,您是返回 the error变量,并且不抛出异常或返回被拒绝的承诺。所以在这种情况下,promiseend will 成功地解决这个问题的价值error多变的。

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

$q.reject 和处理 AngularJS 链式承诺中的错误 的相关文章

随机推荐

  • Swagger PHP - 如何定义嵌套属性?

    我正在使用 Swagger PHP 大多数定义都很容易定义 但我遇到了一个特定数据块的问题 该数据块不属于单独的类 而是属于关联数组 我希望显示的 json 响应 针对此问题进行了简化 id 1 status published gps l
  • ipython %timeit“赋值前引用的局部变量‘a’”

    我正在尝试运行以下代码 但我得到了local variable a referenced before assignment a x for x in range 10 b x for x in range 10 timeit a b 该语
  • 如何重新启动 git 仓库?

    我从我的一个旧项目中获取了一个存储库 并编辑了这些文件 以便我可以将其用作新项目的 骨架 说我在这里 骨架 框架 我已经在那里编辑了存储库 我将如何使用该目录中的这些文件重新启动此存储库 什么should我已经做好了 我所做的就是拉取存储库
  • jQuery 单击处理函数不会在 DOM 加载后添加的元素上触发

    我相信我可以使用 live 来做到这一点 但该方法已被弃用 问题是这样的 我有一个点击处理函数 它应该在任何具有 myClickEl 类的元素上触发 这对于加载时文档中存在的 myClickEl 元素效果很好 但是 如果我在 DOM 加载后
  • Spring配置C3P0与Hibernate?

    我有一个 Spring JPA 应用程序 其中 Hibernate 作为 JPA 提供者 我通过以下方式在 Spring 中配置了 C3P0 数据源
  • ASP .NET Core webapi在中间件中设置cookie

    我试图在执行操作后设置一个 cookie 努力使其工作 如果我从控制器而不是中间件设置它 我就能看到cookie 我已经按照配置顺序进行了操作 但什么也没有 代码示例来自一个干净的 webapi 创建的项目 所以如果有人想玩它很简单 只需创
  • Python-从文本文件中查找行号[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在编写在文本文件中查找的代码 并查看输入是否在其中 E g 我输入 披萨 我的文本文件包含 bread pizza pasta tomato 有没有办法打印披萨一词所在的行号
  • 基于 os 系列的 Maven 条件

    我正在尝试执行以下操作
  • 压缩和未压缩的 .wav 文件

    压缩和未压缩的 wav 文件有什么区别 The WAV格式是 Windows 中音频文件的容器格式 WAV 文件由标题和内容组成 标头包含有关 WAV 文件中包含的音频的大小 持续时间 采样频率 分辨率以及其他信息 通常 标头之后是实际的音
  • 使用 print.xtable 更改表格的字体大小

    我想使用 print xtable 更改表格的字体大小 Using print xT size tiny 有效 但我不知道其他尺寸选项 像 size 7pt 这样的东西会很好 您可以使用以下命令选择特定的字体大小 fontsize
  • 捕获更通用的异常类型是否有好处?

    如果我们要捕捉特定形式的IOException 或任何其他类型的 事实上 我们只尝试捕获几个 并为它们定义明确的输出 说 FileNotFoundException ZipException 我们是否应该始终把它拖下来并用一个覆盖所有基地
  • Windows Phone 开发和单元测试

    我希望启动一个针对 Windows Phone 的项目 但由于缺乏单元测试支持 我有点推迟了 1 我习惯于使用 NUnit XUnit 来满足我的大部分测试需求 并使用 NSubstitute 之类的东西来进行模拟 据我所知 您不能将这些框
  • 不抛出异常时的性能(C++)[重复]

    这个问题在这里已经有答案了 我已经阅读了很多有关 C 异常的内容 并且我所看到的 特别是异常性能是一个很难的话题 我什至试图深入了解 g 的底层 看看异常是如何在汇编中表示的 我是一名 C 程序员 因为我更喜欢低级语言 不久前 我决定使用
  • django-compressor 是否支持模板继承?

    我在用着Django 压缩器压缩我网站的静态 CSS 和 Javascript 文件 由于我通过 Amazon S3 提供网站的静态资产 因此我还使用Django 存储将我的文件上传到 S3 这是我的问题 我正在努力清理base html我
  • 强制 attr=title 弹出 on 元素

    有没有办法 我可以强制元素在元素悬停时显示 标题 弹出窗口 或者如果没有 有没有办法 我可以配置显示标题弹出窗口之前的超时时间 默认情况下 标题在悬停时显示 您无法更改其行为
  • Javascript 或 Flash 导出至 CSV/Excel

    是否有办法将 JSON 数据导出到 CSV Excel 而无需与服务器端进行任何交互 仅使用 JavaScript 还是闪存 我目前正在使用 ZeroClipboard 将值复制到剪贴板 但我想从浏览器 FF Chrome IE 等 直接将
  • net/http.rb:560:in `initialize': getaddrinfo: 名称或服务未知(SocketError)

    timestamp nil def generate oauth url timestamp timestamp url CONNECT URL REQUEST TOKEN PATH oauth callback OAUTH CALLBAC
  • 带有 v-for 的动态 v 模型

    我有一个 v for 循环 它将吐出多行输入 我想将每个单独的行动态保存到数组对象中 v for table class table m 0 tbody tr td fund name td tr tbody table
  • 来自电子邮件地址的域的正则表达式

    任何人都可以帮助我使用正则表达式来返回电子邮件地址的末尾部分 符号之后 吗 我是正则表达式的新手 但想学习如何使用它 而不是编写低效的 Net 字符串函数 例如 对于输入 电子邮件受保护 我需要 example com 的输出 干杯 蒂姆
  • $q.reject 和处理 AngularJS 链式承诺中的错误

    我无法理解使用链接承诺进行错误处理的基本概念 为了学习规则 我写了一个简单的例子 猜测结果会是什么 但不幸的是 它的行为并不像我想象的那样 我已经阅读了多篇有关该主题的文章 但由于我的英语水平不佳 我可能无法获得详细信息 无论如何 这是我的