我正在浏览整个外部引入的数据,在某些时候我需要打破并结束我的链接并重定向页面。
我有这样的事情:
Api文件
gamesApi.getAllResultsWithTeamInformation(passData)
.then(gamesApi.filterPreviousResults)
.then(gamesApi.checkIfWeHaveGamesToSaveToDB) //Break at if nothing to save
.then(gamesApi.loopAndSaveToDB)
.then(gamesApi.selectLatestLeagueID)
我希望中断发生的功能
checkIfWeHaveGamesToSaveToDB: function (passData) {
if(passData.uniqueData.length === 0){
passData.req.flash('notice', 'Sorry there was nothing new to save);
passData.res.redirect('/admin/games/' + passata.leagueInfo.year);
passData.res.end();
}else {
return passData;
}
},
但是当passData.uniqueData.length === 0
为真时,它将重定向页面,但链将继续运行。如果passData.uniqueData.length === 0
为真,我怎样才能打破/停止?
答案 0 :(得分:2)
更改checkIfWeHaveGamesToSaveToDB函数,如下所示
checkIfWeHaveGamesToSaveToDB: function (passData) {
if(passData.uniqueData.length === 0){
passData.req.flash('notice', 'Sorry there was nothing new to save);
passData.res.redirect('/admin/games/' + passata.leagueInfo.year);
passData.res.end();
// either
return Promise.reject('nothing new to save');
// or
throw 'nothing new to save';
}else {
return passData;
}
},
请记住在“then”链的末尾添加.catch
以正确处理拒绝(甚至不做任何事情)
答案 1 :(得分:1)
我通常使用两种可能的解决方案。
解决方案1:嵌套你的承诺
sth
.then(sth)
.then(sth)
.then(sth)
.then((result) => {
if (looksGood(result)) {
return sth
.then(sth)
.then(sth)
.then(sth)
} else {
// do nothing?
}
})
解决方案2:抛出自定义错误
sth
.then(sth)
.then(sth)
.then(sth)
.then((result) => {
if (looksGood(result)) {
return result
} else {
throw new AbortError()
}
})
.then(sth)
.then(sth)
.then(sth)
.catch(...) // catch and ignore AbortError, rethrow anything else
我相信这两个提出的解决方案的优点和缺点都非常明确:解决方案1看起来很难看,解决方案2误用了错误抛出机制 - 这至少没有什么争议。通过编写一些用于抛出/捕获AbortError的自定义帮助程序,可以更好地完成解决方案2。
我个人最喜欢的是解决方案。 2:花了一些时间在Python上,我不认为使用自定义异常是一个坏主意。