当承诺在监视函数中解析时,如何使承诺的 then 函数起作用

How to make a promise's then function work when the promised is resolved in a watch function?

本文关键字:函数 承诺 何使 then 起作用 监视      更新时间:2023-09-26

我正在尝试在用户从选择菜单中进行选择后和之后触发一些代码。因此,我尝试使用承诺和 $scope.$watch 函数。我正在解决该监视函数中的承诺,但承诺的 then 函数没有被触发。$scope.$apply() 似乎在这种情况下不起作用。我怎样才能让这个函数触发?

代码如下:

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>

承诺只会解决一次,所以第一次会成功并做你想做的事,但之后的任何时候它都不会再次解决它。[参考] 所以你想要完成的事情不可能用承诺来实现。

为什么你的代码不起作用是因为第一个分辨率是reject,你可以通过在 else 条件中添加 console.log 来验证。一旦被拒绝,承诺就无法改变,因此行为也无法改变。

@PSL是正确的使用标准ng-change