Rupture de la promesse et de la chaîne d'appeler une fonction sur la base de l'étape dans la chaîne où il est cassé (rejeté)

Mise à jour:

Pour aider les futurs spectateurs de ce post, j'ai créé cette démo de pluma de réponse.

Question:

Mon objectif semble assez simple.

  step(1)
  .then(function() {
    return step(2);
  }, function() {
    stepError(1);
    return $q.reject();
  })
  .then(function() {

  }, function() {
    stepError(2);
  });

  function step(n) {
    var deferred = $q.defer();
    //fail on step 1
    (n === 1) ? deferred.reject() : deferred.resolve();
    return deferred.promise;
  }
  function stepError(n) {
    console.log(n); 
  }

Le problème ici est que si j'échoue à l'étape 1, à la fois stepError(1) ET stepError(2) sont licenciés. Si je n'ai pas return $q.reject puis stepError(2) de ne pas être congédié, mais step(2) va, que je comprends. J'ai accompli tout sauf ce que je suis en train de faire.

Comment puis-je écrire des promesses alors que je peux appeler une fonction sur le rejet sans appel de toutes les fonctions dans l'erreur de la chaîne? Ou est-il une autre façon d'accomplir cette?

Voici une démo en live de sorte que vous avez quelque chose à travailler avec.

Mise à jour:

Je genre de l'avez résolu. Ici, je suis la capture de l'erreur à la fin de la chaîne et de transmettre les données reject(data) de sorte que je saurai ce problème à gérer dans la fonction d'erreur. En fait, cela ne répond pas à mes besoins, car je ne veux pas dépendre des données. Il serait boiteux, mais dans mon cas, il serait plus propre de passer à une erreur de rappel à la fonction plutôt que de dépendre sur les données renvoyées à déterminer quoi faire.

Démonstration en direct ici (cliquez).

step(1)
  .then(function() {
    return step(2);
  })
  .then(function() {
    return step(3);
  })
  .then(false, 
    function(x) {
      stepError(x);
    }
  );
  function step(n) {
    console.log('Step '+n);
    var deferred = $q.defer();
    (n === 1) ? deferred.reject(n) : deferred.resolve(n);
    return deferred.promise;
  }
  function stepError(n) {
    console.log('Error '+n); 
  }
InformationsquelleAutor m59 | 2013-12-21