我是否正确地处理了这些承诺?
Am I handling these promises correctly?
有没有更好的方法来简单地捕获这里的所有错误,或者因为这个承诺链中有多个级别有多个请求我没有其他选择?
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.' });
});
}
快速浏览一下,您应该能够完全删除嵌套,如下所示。请注意,如果出现错误,这将始终 return 消息 Request for block-range data failed.
类似于您的代码。原因是,使用 $q.reject()
只会跳过承诺链的执行,直到下一个 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
语法,可以提高可读性。这次实际匹配的错误信息是returned。 (请注意,也可以 return 使用上层语法的特定错误消息)。
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);
}
有没有更好的方法来简单地捕获这里的所有错误,或者因为这个承诺链中有多个级别有多个请求我没有其他选择?
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.' });
});
}
快速浏览一下,您应该能够完全删除嵌套,如下所示。请注意,如果出现错误,这将始终 return 消息 Request for block-range data failed.
类似于您的代码。原因是,使用 $q.reject()
只会跳过承诺链的执行,直到下一个 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
语法,可以提高可读性。这次实际匹配的错误信息是returned。 (请注意,也可以 return 使用上层语法的特定错误消息)。
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);
}