gpt4 book ai didi

javascript - 我是否正确地履行了这些 promise ?

转载 作者:行者123 更新时间:2023-12-01 02:59:36 24 4
gpt4 key购买 nike

是否有更好的方法来简单地捕获此处的所有错误,或者由于此 promise 链中有多个级别且具有多个请求,所以我没有其他选择?

        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.' });
});
}

最佳答案

快速浏览一下,您应该能够完全删除嵌套,如下所示。请注意,如果出现错误,这将始终返回消息 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);

}

关于javascript - 我是否正确地履行了这些 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46527122/

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