一尘不染

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

angularjs

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

该方法$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
                }
            })
    },

阅读 166

收藏
2020-07-04

共1个答案

一尘不染

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

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);
})
2020-07-04