有没有更好的方法来简单地捕获所有错误,或者因为此承诺链中存在多个级别且有多个请求我没有其他选项?
return RequesterService.get('peakBlockIndex', request)
.then(function(res) {
rangeData = res.data;
rangeData.intervals = [];
if (!rangeData.intervals || rangeData.intervals <= 0) {
return $q.reject({ message: 'Request returned no interval data.' });
}
return SiteService.getSite(rangeData.site.id)
.then(function(site) {
if (!site.zoneId) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
return getDayAheadData(site.zoneId, start, end)
.then(function(data) {
return handleBlockRange(rangeData, data[0].data, data[1].data);
})
.catch(function(err) {
return $q.reject({ message: 'Request for cleared & forecasted data failed for the given site.' });
})
})
.catch(function(err) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
})
})
.catch(function(err){
return $q.reject({ message: 'Request for block-range data failed.' });
});
}
答案 0 :(得分:2)
从快速浏览一下,您应该能够完全删除嵌套,如下所示。请注意,如果出现错误,这将始终返回与您的代码类似的消息Request for block-range data failed.
。原因是,使用$q.reject()
只会跳过promise链的执行,直到下一个catch()
处理程序。当您在代码末尾放置这样的处理程序时,所有错误都将在此处捕获。
return RequesterService.get('peakBlockIndex', request)
.then(function(res) {
rangeData = res.data;
rangeData.intervals = [];
if (!rangeData.intervals || rangeData.intervals <= 0) {
return $q.reject({ message: 'Request returned no interval data.' });
}
return SiteService.getSite(rangeData.site.id)
})
.then(function(site) {
if (!site.zoneId) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
return getDayAheadData(site.zoneId, start, end);
})
.then(function(data) {
return handleBlockRange(rangeData, data[0].data, data[1].data);
})
.catch(function(err){
return $q.reject({ message: 'Request for block-range data failed.' });
});
使用较新的async
/ await
语法,可以提高可读性。这次返回实际匹配的错误消息。 (注意,也可以使用上层语法返回特定的错误消息)。
async function someRequest( request ){
let res;
try{
res = await RequesterService.get('peakBlockIndex', request);
} catch(e){
return $q.reject({ message: 'Request for block-range data failed.' });
}
rangeData = res.data;
rangeData.intervals = [];
if (!rangeData.intervals || rangeData.intervals <= 0) {
return $q.reject({ message: 'Request returned no interval data.' });
}
let site;
try {
site = await SiteService.getSite(rangeData.site.id);
} catch(e) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
if (!site.zoneId) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
let data;
try{
data = getDayAheadData(site.zoneId, start, end);
} catch(e){
return $q.reject({ message: 'Request for cleared & forecasted data failed for the given site.' });
}
return handleBlockRange(rangeData, data[0].data, data[1].data);
}