当承诺在手表功能中得到解决时,如何使承诺的 then 功能起作用?
How to make a promise's then function work when the promised is resolved in a watch function?
我正在尝试在用户从 select 菜单中创建 selection 之后以及何时触发一些代码。因此,我尝试使用 promises 和 $scope.$watch 函数。我正在解决那个监视函数中的承诺,但是承诺的 then 函数没有被解雇。 $scope.$apply() 在这种情况下似乎不起作用。
我怎样才能触发这个 then 函数?
代码如下:
var nameSpace = angular.module("test", []);
nameSpace.controller("DataRetriever", ['$scope','$http', '$q', function($scope, $http, $q)
{
$scope.options = ["1","2","3"];
$scope.displayText = false;
console.log("options set");
var deferred = $q.defer();
$scope.selectedOption = "";
$scope.$watch("selectedOption", function (newValue, oldValue) {
if (newValue != "") {
deferred.resolve(newValue);
console.log("Resolve called! New value: ", newValue);
} else {
deferred.reject("Invalid option!");
}
});
deferred.promise.then(function(data){
$scope.displayText = true;
console.log("Then success callback function executed!");
});
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test" ng-controller="DataRetriever as dr">
<select ng-model="selectedOption"><option ng-repeat="option in options">{{option}}</option>
</select>
<div ng-show="displayText">Then success callback function executed!</div>
</div>
Promises 只会被解决一次,所以第一次会成功并做你想做的事,但之后的任何时候都不会再次解决它。 [Ref] 所以你想要完成的事情是不可能用承诺实现的。
为什么你的代码不起作用是因为第一个解析是reject
,你可以通过在else条件中添加console.log
来验证。一旦被拒绝,承诺就无法更改,因此行为也无法更改。
@PSL 是正确使用标准ng-change
我正在尝试在用户从 select 菜单中创建 selection 之后以及何时触发一些代码。因此,我尝试使用 promises 和 $scope.$watch 函数。我正在解决那个监视函数中的承诺,但是承诺的 then 函数没有被解雇。 $scope.$apply() 在这种情况下似乎不起作用。 我怎样才能触发这个 then 函数?
代码如下:
var nameSpace = angular.module("test", []);
nameSpace.controller("DataRetriever", ['$scope','$http', '$q', function($scope, $http, $q)
{
$scope.options = ["1","2","3"];
$scope.displayText = false;
console.log("options set");
var deferred = $q.defer();
$scope.selectedOption = "";
$scope.$watch("selectedOption", function (newValue, oldValue) {
if (newValue != "") {
deferred.resolve(newValue);
console.log("Resolve called! New value: ", newValue);
} else {
deferred.reject("Invalid option!");
}
});
deferred.promise.then(function(data){
$scope.displayText = true;
console.log("Then success callback function executed!");
});
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test" ng-controller="DataRetriever as dr">
<select ng-model="selectedOption"><option ng-repeat="option in options">{{option}}</option>
</select>
<div ng-show="displayText">Then success callback function executed!</div>
</div>
Promises 只会被解决一次,所以第一次会成功并做你想做的事,但之后的任何时候都不会再次解决它。 [Ref] 所以你想要完成的事情是不可能用承诺实现的。
为什么你的代码不起作用是因为第一个解析是reject
,你可以通过在else条件中添加console.log
来验证。一旦被拒绝,承诺就无法更改,因此行为也无法更改。
@PSL 是正确使用标准ng-change