2017-03-26 1 views
0

Quelqu'un peut-il expliquer pourquoi la deuxième promesse retournée par then function est résolue? Il ressemble à un bogue Angular JS dans sa mise en œuvre Promises. Selon la documentation here la deuxième promesse aurait également dû être rejetée.Angular résout la promesse retournée par la fonction "then" lorsque la promesse principale est rejetée

// Code goes here 
 
var myMod = angular.module("myMod", []); 
 
myMod.controller('bodyCtrl', function($scope, $timeout, $q) { 
 
    var deferred = $q.defer(); 
 
    deferred.promise.then(function(d) { 
 
     console.log("success called"); 
 
     return d; 
 
    }, function(d) { 
 
     console.log("failure called"); 
 
     return d; 
 
    }) 
 
    .then(function(d) { 
 
     console.log("success called2"); 
 
     return d; 
 
    }, function(d) { 
 
     console.log("failure called2"); 
 
     return d; 
 
    }); 
 
    
 
    $timeout(function() { 
 
     deferred.reject(); 
 
    }, 2 * 1000); 
 
});
<!DOCTYPE html> 
 
<html ng-app="myMod"> 
 

 
    <head> 
 
    <script src="https://code.angularjs.org/1.5.8/angular.js"></script> 
 
    <link rel="stylesheet" href="style.css" /> 
 
    <script src="script.js"></script> 
 
    </head> 
 

 
    <body ng-controller="bodyCtrl"> 
 
    <h1>Hello Plunker!</h1> 
 
    </body> 
 

 
</html>

+0

liés à http://stackoverflow.com/questions/18758058/angularjs-promise-rejection-chaining –

+0

@georgeawg ... ou retourner 'q.reject de $() ' –

Répondre

1

Comme @Nikolaj Dam Larsen et @georgeawg dit, votre problème est que dans votre errorCallback() vous n'êtes pas jeter l'exception. Voir l'exemple suivant (PLUNKER) ...

function bodyCtrl($timeout, $q){ 
    deferred.promise 
    .then(function(d) { //Promise 1 
     console.log("success called"); 
     return d; 
    }, function(e) { 
     console.log("failure called"); 
     throw e; //Throw instead return 
    }) 
    .then(function(d) { //Promise 2 
     console.log("success called2"); 
     return d; 
    }, function(e) { 
     console.log("failure called2"); 
     throw e; //Throw instead return 
    }); 

    $timeout(function() { 
     deferred.reject("Custom Rejected: " + new Date()); 
    }, 2000); 
} 
+0

Vérifiez également cet article pour mieux comprendre http://stackoverflow.com/questions/23559341/using-success-error-finally-catch-with-promises-in-angularjs –

1

C'est par la conception. Cela se produit parce qu'en fournissant la promesse avec un errorCallback, vous manipulez/résolvez/attrapez le rejet (comme si vous attrapiez une exception dans un try ... catch block). Si vous supprimez la première fonction errorCallback, vous devriez voir failure called2 dans la console de développeur à la place, ou si vous lancez une nouvelle exception dans le premier rappel.