2017-10-16 1 views
0

J'ai une chaîne de promesse simplifiée se présente comme suit:conditionnellement commencer une chaîne de promesse d'une promesse spécifique

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)); 

Fondamentalement, je lis une liste de films à partir d'un fichier et de les transmettre autour de sorte que je peux Trouver une bande-annonce pour le film. Ce que je wan't à faire est en cas d'erreur, répétez la chaîne de promesse à partir de selectRandom sur, sans avoir à readDB et parseQuery

En ce moment, j'ai un code de travail, mais il définit deux fois la chaîne:

//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)); 

Existe-t-il une manière plus simple de faire cela?

+0

On dirait que vous voulez juste sécher votre code, mais vous avez partiellement fait cela soit je suis malentendu ou vous manquez l'évidence. Ne pourriez-vous pas simplement remplacer une partie du code en bas par 'selectMovie()'? –

+0

Comme readDB puis parseQuery puis sélectionnez Movie()? Devrait sélectionner le film avoir le mot-clé de retour? Ou juste comme est? – medicengonzo

+0

Je ne pense pas que 'selectMovie()' _s'agisse d'une instruction return à moins que vous ne vouliez ajouter plus de chaînes de promesses par la suite, mais c'est généralement une bonne idée de renvoyer _something_. Mais oui, déplacez-le, essayez, et voyez ce qui se passe. –

Répondre

1

Remplacez .then (selectRandom) et tout ce qui suit en appelant votre fonction selectMovie().