首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AngularJS -在$q.all()上失败重新静默

AngularJS -在$q.all()上失败重新静默
EN

Stack Overflow用户
提问于 2013-12-13 17:29:15
回答 5查看 10.6K关注 0票数 17

我正在尝试填充一些本地数据,解析一系列远程调用。

当每个承诺都得到解决时,我加载数据并继续。

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

代码语言:javascript
复制
        $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()完全忽略该条目,即使没有失败(请注意函数中的console.log )...

代码语言:javascript
复制
        $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,我走得更远了。实现错误回调,我可以避免链的中断,并推送已解析的promises的值。

但是,控制台上仍然会显示一个严重的异常...如果我不能尝试/捕获异步请求,我如何摆脱它?

调用者代码

代码语言:javascript
复制
    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)
        })

被调用方代码(使用异常插入)

代码语言:javascript
复制
    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
                }
            })
    },
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-12-15 20:31:23

这将会起作用,但也会将错误推送到数组。

代码语言:javascript
复制
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);
})

你也应该提高对promises的理解,你永远不应该在promises中使用try-catch -当使用promises时,你使用.catch()方法(其他的都是隐式的try)。这对正常错误和异步错误都有效。

如果您想要完全忽略这些错误:

代码语言:javascript
复制
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);
})
票数 25
EN

Stack Overflow用户

发布于 2015-10-14 20:28:22

我认为这样做更容易:

代码语言:javascript
复制
$q.all([
 mypromise1.$promise.catch(angular.noop),
 mypromise2.$promise.catch(angular.noop),
 mypromise1.$promise.catch(angular.noop)
])
.then(function success(data) {
 //.....
});
票数 2
EN

Stack Overflow用户

发布于 2013-12-13 18:05:58

我不知道你说的弹性是什么意思。如果其中一个承诺失败了,你希望发生什么?

您的try-catch将不起作用,因为promise将异步失败。

但是,您可以将错误处理程序作为第二个参数传递给then()调用,并在那里做任何您想做的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20563042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档