gpt4 book ai didi

ajax - AngularJS - $q.all() 上的弹性失败

转载 作者:行者123 更新时间:2023-12-03 13:56:18 24 4
gpt4 key购买 nike

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

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

输出:

[Object]



关于如何将其包装为有弹性的任何提示?

感谢@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)
})

被调用者代码(注入(inject)异常)
    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 with promises - 当使用 promises 时,你使用 .catch()方法(其他所有内容都隐含为 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);
})

关于ajax - AngularJS - $q.all() 上的弹性失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20563042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com