【问题标题】:How to make a promise's then function work when the promised is resolved in a watch function?当 promise 在 watch 函数中解决时,如何使 promise 的 then 函数工作?
【发布时间】:2015-03-17 00:09:45
【问题描述】:

我试图在用户从选择菜单中进行选择之后触发一些代码。因此,我尝试使用 Promise 和 $scope.$watch 函数。我正在解决那个 watch 函数中的 promise,但是 promise 的 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>

【问题讨论】:

  • 你可以认为 $watch() 调用是给你一个承诺,当用户改变一个暴露在作用域上的值时它会被调用。它不适合你吗?
  • 也许你有什么想法,但我还是想问一下。
  • @Werlang 我猜可能 OP 正在尝试实现更改事件处理程序。
  • @PSL 好吧,我对这个很感兴趣。希望他能给个理由。
  • 实际上我尝试有几个选择元素。只有一次 每个 选择元素都有一个选择的选项,才应该使用这些选择元素的值发出 HTTP GET 请求。而且由于我可以通过 $q.all(promises) 检查是否所有承诺都已解决,然后才调用一个函数,所以我认为我应该使用它们。现在,由于我需要在选择元素的值发生更改后立即再次触发请求,因此我尝试使用 $watch 来实现此目的。

标签: javascript angularjs promise watch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多