当前位置: 首页 > 面试题库 >

AngularJS-对$ q.all()的恢复失败

蒋泰
2023-03-14
问题内容

我正在尝试填充一些本地数据,以解决一系列远程调用。
当每个诺言都得到解决后,我将加载数据并继续。

该方法$q.all( [] )正是这样做的:

        $q.all([
            this.getUserInfo(11)
                .then(function (r) {
                    results.push(r)
                }),

            this.getUserConns()
                .then(function (r) {
                    results.push(r)
                }),

            this.getUserCtxs()
                .then(function (r) {
                    results.push(r)
                })
        ])
        .then(function () {
            console.log(results)
        })

问题是,此代码不具有弹性。
如果这些呼叫中的任何一个失败,那么没人会得到鱼!

将调用包装在try / catch语句中,$q.all()即使没有失败也只会导致完全忽略该条目(请注意func中的console.log)…

        $q.all([
            this.getUserInfo2(11)
                .then(function (r) {
                    results.push(r)
                }),

            function () {
                try {
                    this.getUserGroups()
                        .then(function (r) {
                            console.log(r)
                            results.push(r)
                        })
                }
                catch (err) {
                    console.log(err)
                }
            },
        ])
        .then(function () {
            console.log(results)
        })

输出:

[目的]

关于如何包装它以增强弹性的任何提示?

感谢@dtabuenc,我走了更进一步。实现错误回调,我可以避免中断链,并推送已解决的Promise的值。

但是,控制台上仍显示令人讨厌的异常…如果无法尝试/捕获异步请求,该如何解决?

来电显示

    return $q.all([

            this.getUserInfo(user_id)
                .then(function (r) {
                    results['personal_details'] = r
                }),

            this.getUserConns()
                .then(
                    function (r) {
                    results['connections'] = r
                    },
                    function(err) {
                        console.log(err)
                    })

        ])
        .then(function () {
            return (results)
        })

被叫方代码(注入异常)

    getUserConns: function() {

        return __doCall( ws.getUserConnections, {} )
            .then( function(r) {

                // very generic exception injected
                throw new Error

                if (r && r.data['return_code'] === 0) {
                    return r.data['entries']
                }
                else {
                    console.log('unable to retrieve the activity - err: '+r.data['return_code'])
                    return null
                }
            })
    },

问题答案:

这将起作用,但也会将错误推送到阵列。

function push(r) {
    results.push(r);
}

$q.all([
    this.getUserInfo(11).then(push).catch(push),
    this.getUserConns().then(push).catch(push),
    this.getUserCtxs().then(push).catch(push)
])
.then(function () {
    console.log(results);
})

您还应该提高对Promise的理解, 永远不要try-catch与Promise一起使用-
使用Promise时,请使用.catch()方法(其他所有内容都隐含a try)。这适用于普通错误以及异步错误。

如果要完全忽略错误:

function push(r) {
    results.push(r);
}

function noop() {}

$q.all([
    this.getUserInfo(11).then(push).catch(noop),
    this.getUserConns().then(push).catch(noop),
    this.getUserCtxs().then(push).catch(noop)
])
.then(function () {
    console.log(results);
})


 类似资料:
  • 问题内容: 我已经在angularjs中实现了$ q.all,但是我无法使代码正常工作。这是我的代码: 这是我的控制器,它调用服务: 我认为在我的服务中设置$ q.all存在一些问题。 问题答案: 在javascript中 不仅有 : 阅读有关javaScript作用域和提升的文章。 看看我如何调试您的代码: 当您在for循环内编写代码时,它会被 提升 到函数顶部,这意味着javascript在之

  • 我在PHPMyAdmin中更改了我的“root”@“localhost”帐户的密码,并将自己锁定在浏览器的PHPMyAdmin之外。我正在使用WAMP 2.5。 在这个问题上提供的解决方案不适合我,因为不幸的是,我丢失了重新分配root的密码。 有些解决方案要求用户通过命令行(包括此源代码)重置密码,我曾尝试通过Windows命令行重置密码,但没有成功,因为我现在没有权限: WAMP附带了一个My

  • 我刚刚继承了一个由7台服务器组成并通过Ambari管理的hadoop集群(以前从未使用过hadoop)。 今天Ambari对server3上的所有服务以及ZooKeeper服务(托管在服务器1、2和3上)、ZKFailover(托管在服务器1和2上)和ZooKeeper客户端(托管在4,5,6,7上)停止并全部拒绝启动。这也导致Solr服务停止工作。 经过一些调查,我发现server3上的ZooK

  • 我正在尝试检查 22,800 年数据库中的 2012 个 url,以找出哪些仍然有效。我在 PyCharm 的 Python 3.8 中使用 urllib。它通过我读入的文本文件中的前 47 个 url。然后,当找不到主机时,它会崩溃。 这是错误输出: 回溯(最近一次调用):文件“C:\Users\rmcape\AppData\Local\Programs\Python\Python38-32\l

  • MySQL的恢复 常用命令 利用source命令恢复数据库 利用mysql命令恢复(标准) gzip备份文件包的解压方式 常用命令 去除多余注释查看备份数据 egrep -v "#|\*|--|^$" ~/test.sql 利用source命令恢复数据库 进入到mysql数据库客户端,mysql -uroot -p登录后,使用source命令,后面跟脚本文件 source all.sql # 默认

  • 我在AWS EC2上运行3个节点集群,我的一个节点崩溃了,重新启动后,我看到2900个未分配的碎片和集群状态为红色。 我将索引配置为有5个碎片和1个副本--我不明白为什么重新启动后碎片不能从副本中恢复。 我尝试使用elasticsearch重新路由API https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-