2017-03-26 6 views
0

関数によって返された2番目の約束がなぜ解決されるのか説明できますか?これはPromises実装のAngular JSバグのようです。文書hereによると、2番目の約束事も却下されているはずです。Angularは、メインプロミスが拒否されたときに "then"関数によって返された約束を解決します。

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

http://stackoverflow.com/questions/18758058/angularjs-promise-rejection-chaining –

+0

@georgeawg ...に関連する...次の例(PLUNKER)を参照するか、 '$のq.rejectを返します() ' –

答えて

1

として@Nikolajダムラーセン@georgeawgはあなたの問題はあなたが例外をスローしていない、あなたのerrorCallbackで()ということである、と言います。

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

また、この記事をよく理解するためにチェックしてください。http://stackoverflow.com/questions/23559341/using-success-error-finally-catch-with-promises-in-angularjs –

1

これは仕様によるものです。これはerrorCallbackを約束することで、実際には却下を処理/解決/キャッチすることになります(ちょうどtry ... catchブロックで例外をキャッチしているかのように)。最初のerrorCallback関数を削除した場合は、代わりに開発者コンソールにfailure called2が表示されているか、最初のコールバックに新しい例外がスローされている必要があります。

関連する問題