javascript - 解决函数未触发

标签 javascript angularjs

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

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

索引.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 超时限制之后,我可以看到alert('2') 和alert('3'),但 promisse.then() 触发中没有任何警报。 为什么会这样?

最佳答案

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

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

这是因为 setTimeout 超出了 Angular 范围,并且它不知道 Promise 应该被解析(因为 $digest 循环看不到它已被更改)

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

看看这个 fiddle :http://jsfiddle.net/hK9XW/2/

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

关于javascript - 解决函数未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23248894/

相关文章:

javascript - 这是改变 react 状态的可接受方法吗?

javascript - 使用 Javascript History API 时,新的 URL 内容应该是什么?

javascript - 从ajax读取文本文件并将字符串发送到html文件

javascript - 使用 Javascript 在 Html 中将 Xml 数据或 Json 对象预览为 XML 树

javascript - 使用 AngularJS 更新 cookie

javascript - 如何使用时刻2.0.0设置时区

javascript - Cordova 使用 SplashScreen 插件在另一个文件夹中查找 cordova_plugins.js

javascript - Nodejs中如何将json对象数组转换为String?

angularJS $broadcast 和 $on

javascript - Angularjs是基于哪种设计模式?,学习一种设计模式就够了?