打破node.js然后()s

时间:2015-11-22 13:42:04

标签: javascript node.js promise

我正在浏览整个外部引入的数据,在某些时候我需要打破并结束我的链接并重定向页面。

我有这样的事情:

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为真,我怎样才能打破/停止?

2 个答案:

答案 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上,我不认为使用自定义异常是一个坏主意。