问题描述
<p ng-app='MyApp'> <p ng-controller='MyController'> <label for='flag'>成功 <input type='checkbox' ng-model='flag' /><br/> </label> <p ng-cloak> {{status}} </p> <hr/> <button ng-click='handle()'>点击我</button> </p></p><script> angular.module('MyApp', []) .controller('MyController', ['$scope', '$q', function ($scope, $q) { $scope.flag = true; $scope.handle = function () {var deferred = $q.defer();var promise = deferred.promise;if ($scope.flag) { deferred.resolve('you are lucky!');} else { deferred.reject('sorry, it lost!');}promise.then(function (result) { result = result + 'you have passed the first then()'; $scope.status = result; return result;}, function (error) { error = error + 'failed but you have passed the first then()'; $scope.status = error; return error;}).then(function (result) { alert('Success: ' + result);}, function (error) { alert('Fail: ' + error);}) } }]);</script>
为什么当我$scope.flag为false的时候第一个then走是error而第二个走的是success,要改的话改怎么改
问题解答
回答1:promise.then(function (result) { result = result + 'you have passed the first then()'; $scope.status = result; // return result; return $q.resolve(result); }, function (error) { error = error + 'failed but you have passed the first then()'; $scope.status = error; // return error; return $q.reject(error); }).then(function (result) { alert('Success: ' + result); }, function (error) { alert('Fail: ' + error); })回答2:
每个.then都会返回一个新的promise。新的promise执行失败的代码后,会resolve当前传入.then的函数的返回值。因此第二个执行的是success。
这问题说多了也没用,自己看promise源码,一下就清楚了。