不能使用2 js函数与它们之间的睡眠

时间:2016-07-06 20:22:29

标签: javascript html angularjs angularjs-directive

我正在尝试创建一个用户键入文本的角度表单,而当他执行此操作时,下面的文字说“用户正在键入...”。

然后它等待200毫秒,文本标签变为空白(“用户输入”消失)。

我正在使用角度ng-change指令。 我的代码如下。

问题在于,由于某些原因,我在为它们之间运行2个方法而编写的帮助方法存在问题。 由于某种原因,文字“用户正在打字......”在短暂的睡眠后不会消失。

为什么会这样?

感谢

angular.module('myApp', [])
.controller('myCtrl', ['$scope', function($scope) {
  $scope.count = 0;
  $scope.myFunc = function() {
    runTwoFunctionWithSleepBetweenThem(function (){$scope.text='user is typing...';},function (){$scope.text='';},200);
  };

  var runTwoFunctionWithSleepBetweenThem = function(foo1,foo2, time) {
    var sleep =function (time) {
      return new Promise((resolve) => setTimeout(resolve, time));
    }
    foo1();
    sleep(time).then(() => {
      foo2();
    });
  }
}]);
<!DOCTYPE html>
<html>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="myApp">
  <div ng-controller="myCtrl">
    <p>Write something in the input field:</p>
    <input type="text" ng-change="myFunc()" ng-model="myValue" />
    <p>{{text}}</p>
  </div>
</body>
</html>

3 个答案:

答案 0 :(得分:3)

正如AndréVale和Titus在评论中提到的那样,你已经超出了范围应用程序周期,因此在更新范围后,Angular不知道要进行“脏检查”。

var runTwoFunctionWithSleepBetweenThem=function(foo1,foo2, time) {
  var sleep = function (time) {
    return new Promise((resolve) => setTimeout(resolve, time));
  }
  foo1();
  sleep(time).then(() => {
    foo2();
    $scope.$apply();
  });
}

您的sleep函数近似https://datatables.net/manual/tech-notes/4,这是基于Promise的;您可以轻松切换到它,并且还可以利用默认情况下它将在$apply块中调用该函数的事实:

// Inject the $timeout service in your controller.
var runTwoFunctionWithSleepBetweenThem=function(foo1, foo2, time) {
  foo1();
  $timeout(foo2, time);
}

如果你想让这个完全承诺兼容,如果它返回一个承诺就延迟foo1,如果它拒绝则中止,那么你可以这样改写它:

// Inject $timeout and $q.
var runTwoFunctionWithSleepBetweenThem=function(foo1, foo2, time) {
  $q.when(foo1()).then(() => $timeout(foo2, time));
}

答案 1 :(得分:1)

您可以为此行为定义服务:

array

用法(将[{1}}服务注入app.service('Sleep', Sleep); Sleep.$inject = [$timeout] function Sleep($timeout) { return time =>new Promise((ok) => {$timeout(ok, time);}); } 后):

Sleep

答案 2 :(得分:1)

如果您可以使用下划线,请查看_.debounce。人们对$ scope也是正确的。$ apply();

inner.bat