有条件地从特定承诺开始承诺链

时间:2017-10-16 17:50:12

标签: javascript node.js promise

我有一个简化的承诺链看起来像这样:

readDB(file)
.then(parseQuery)
  .catch((err) => console.error(err))
.then(selectRandom)
  .catch((err) => console.error(err))
.then(requestTrailer)
  .catch((err) => {
    if(err == 'Got error: No results found') {
      throw new Error(err);
    }
  })
    .then(renderMovie)
      .catch((err) => console.error(err));

基本上我正在从文件中读取电影列表并传递它们,以便我可以找到电影的预告片。我不想做的是出现错误,从selectRandom开始重复承诺链,而不必readDBparseQuery

现在我有一个工作代码,但它定义了两次链:

//I wrap the second round of promises in a function
selectMovie(){ 
    selectRandom(movies)
        .then(requestTrailer)
            .catch((err) => {
                if(err == 'Got error: No results found') {
                  selectMovie(); //Start the function again
                  throw new Error(err);
                }
            })
            .then(renderMovie)
            .catch((err) => console.error(err));
}

//Now start the promise chain
readDB(file)
.then(parseQuery)
  .catch((err) => console.error(err))
.then(selectRandom)
  .catch((err) => console.error(err))
.then(requestTrailer)
  .catch((err) => {
    if(err == 'Got error: No results found') {
      selectMovie(); //Start second round
      throw new Error(err);
    }
  })
    .then(renderMovie)
      .catch((err) => console.error(err));

有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

通过调用selectMovie()函数替换.then(selectRandom)及其后的所有内容。