Я пытаюсь заполнить некоторые локальные данные, обрабатывая серию удаленных вызовов.
Когда каждое обещание разрешено, я загружаю данные и продолжаю.
Метод $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()
полностью игнорировать запись, даже если она не завершается ошибкой (обратите внимание на console.log в func)...
$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 я сделал еще один шаг вперед. Реализуя обратный вызов ошибки, я могу избежать разрыва цепочки и протолкнуть значения разрешенных промисов.
Однако на консоли по-прежнему отображается неприятное исключение... Как я могу избавиться от этого, если я не могу попробовать/отловить асинхронные запросы?
Код вызывающего абонента
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
}
})
},