resolve函数未启动

resolve function not firing

本文关键字:启动 函数 resolve      更新时间:2023-09-26

我正在学习AngularJs。我尝试创建一个非常简单的示例来理解Promise。请参阅以下代码:

http://jsfiddle.net/HB7LU/3221/

Index.html:

<!doctype html>
<html ng-app="myApp">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
    <script src="js/main.js"></script>
  </head>
  <body>
      <div ng-controller="displayController">
          <input id="Button1" type="button" value="Learn Promise" ng-click="Click()" />
      </div>
  </body>
</html>

main.js

var app = angular.module('myApp', []);
    app.controller('displayController', function ($scope, $q) {
        alert('Ctrl');
        $scope.Click = function () {
            alert('1');
            var deferred = $q.defer();
            var promisse= deferred.promise;
            promisse.then(function (successResult) {
                alert('Inside Promise success ' + successResult);
            }, function (failureResult) {
                alert('Inside Promise Failure ' + failureResult);
            });
            setTimeout(function () {
                alert('2');
                deferred.resolve('After timeout');
                alert('3');
            }, 1000);
        }
    });

超过1000的超时限制后,我可以看到警报('2')和警报('3'),但没有警报在promise.then()火内。为什么会这样?

几件事:您使用的是javascript的setTimeout。我建议使用angular提供的$timeout。(如果你真的想使用setTimeout,你必须这样做:

setTimeout(function(){
    $scope.$apply(function(){ deferred.resolve('resolving value'); });
}, 1000);

这是因为setTimeout在angular之外,它不知道promise应该被解决(因为$digest循环没有看到它已经被更改)

此外,您不能拒绝已解决的承诺(反之亦然)。承诺只能解决或拒绝一次。如果您想在解析后拒绝promise,则必须创建一个新的promise对象。

看看这个小提琴:http://jsfiddle.net/hK9XW/2/

我在这里使用了$timeout而不是setTimeout。

您需要将对resolve的调用封装在$rootScope.$apply()中,因为Angular.JS摘要循环中没有涵盖setTimeout函数。但在您的情况下,更好的解决方案是简单地使用$timeout服务,该服务保证在angular.js摘要周期内运行:

var app = angular.module('myApp', []);
    app.controller('displayController', function ($scope, $q, $timeout) {
        alert('Ctrl');
        $scope.Click = function () {
            alert('1');
            var deferred = $q.defer();
            var promisse= deferred.promise;
            promisse.then(function (successResult) {
                alert('Inside Promise success ' + successResult);
            }, function (failureResult) {
                alert('Inside Promise Failure ' + failureResult);
            });
            $timeout(function () {
                alert('2');
                deferred.resolve('After timeout');
                alert('3');
            }, 1000);
        }
    });

希望这能有所帮助!