Angularjs 在angular JS中等待事件在服务器端发生

Angularjs 在angular JS中等待事件在服务器端发生,angularjs,Angularjs,我对angularJS真的很陌生。我需要开发一个页面,让angular JS在服务器端等待事件发生,这样angular JS应该每2秒钟使用$http调用检查服务器。一旦该事件完成,Angular不应再次调用对服务器的任何$http调用 我尝试了不同的方法,但它给了我类似于“在过去5次迭代中触发了观察者:[]”的错误 请告诉我怎么做 下面是我的代码 HTML 在您的示例中,$scope.pageIsReady不存在。您可以将$timeout服务注入控制器,并将http调用封装在其中: var

我对angularJS真的很陌生。我需要开发一个页面,让angular JS在服务器端等待事件发生,这样angular JS应该每2秒钟使用$http调用检查服务器。一旦该事件完成,Angular不应再次调用对服务器的任何$http调用

我尝试了不同的方法,但它给了我类似于“在过去5次迭代中触发了观察者:[]”的错误

请告诉我怎么做

下面是我的代码

HTML


在您的示例中,$scope.pageIsReady不存在。您可以将$timeout服务注入控制器,并将http调用封装在其中:

  var timeoutInstance = $timeout(function(){
    $http.get("/EventManager/IsEventDone")
                 .then(function (response) {
                     $scope.ready = Boolean(response.data);

                    if($scope.ready){
                       $timeout.cancel(timeoutInstance);
                    else
                       $scope.getData();
    }

                 });
    },5000);
取消将停止调用超时。我没有测试过这一点,但它应该是沿着这些路线

也不确定您使用的是哪种类型的后端,但如果是.net,您可以查看使用套接字的SignalR,这样服务器端就可以告诉前端它准备好了,因此您不再需要使用轮询

我不相信公认的答案确实有效,也不能解决最初的问题。所以,我在这里分享我的2美分

$scope.ready=$scope.getData()
每次都会将
$scope.ready
设置为
undefined
,因为此方法不返回任何内容。因此,
ng show=“!isEventDone()”
将始终显示DOM

对于angular中的短轮询,应该使用angular而不是
setInterval

此外,我还重构了一些冗余

    var ngApp = angular.module("ngApp",[]);

    ngApp.controller('myController', function ($scope, $http, $interval) {

       var intervalPromise = $interval($scope.getData, 5000);

       $scope.getData = function () {
           if (! $scope.isEventDone) {
               $http
                   .get("/EventManager/IsEventDone")
                   .then(function (response) {
                       $scope.isEventDone = Boolean(response.data);
                       if($scope.isEventDone) {
                           $interval.cancel(intervalPromise);
                       }
               });
           }
           else {
               $interval.cancel(intervalPromise);
           }
        };

    });
这应该可以解决您最初的问题。但是,在某些情况下,您的服务器可能处于高负载状态,需要3秒钟才能做出响应。在这种情况下,您每2秒调用一次服务器,因为您在上一个请求启动后等待5秒,而在上一个请求结束后不等待

比这更好的解决方案是使用像
async
这样的模块,它可以轻松处理异步方法。结合:

这将在请求结束后调用超时

如果您可以控制服务器,更好的替代方法是使用一个可以启用长轮询(服务器通知客户机而不是客户机频繁发出请求)的服务器,这不会随着客户机的增长而显著增加服务器上的负载

我希望这有帮助

  var timeoutInstance = $timeout(function(){
    $http.get("/EventManager/IsEventDone")
                 .then(function (response) {
                     $scope.ready = Boolean(response.data);

                    if($scope.ready){
                       $timeout.cancel(timeoutInstance);
                    else
                       $scope.getData();
    }

                 });
    },5000);
    var ngApp = angular.module("ngApp",[]);

    ngApp.controller('myController', function ($scope, $http, $interval) {

       var intervalPromise = $interval($scope.getData, 5000);

       $scope.getData = function () {
           if (! $scope.isEventDone) {
               $http
                   .get("/EventManager/IsEventDone")
                   .then(function (response) {
                       $scope.isEventDone = Boolean(response.data);
                       if($scope.isEventDone) {
                           $interval.cancel(intervalPromise);
                       }
               });
           }
           else {
               $interval.cancel(intervalPromise);
           }
        };

    });
    var ngApp = angular.module("ngApp",[]);

    ngApp.controller('myController', function ($scope, $http, $timeout) {

       var getData = function(cb){
           if(!$scope.isEventDone) return cb();
           $http.get("/EventManager/IsEventDone")
             .then(function (response) {
                 $scope.isEventDone = Boolean(response.data);
                 cb();
             });
       };

       // do during will run getData at least once
       async.doDuring(getData, function test(err, cb) {
           // asynchronous test method to see if loop should still occur
           // call callback 5 seconds after getData has responded 
           // instead of counting 5 seconds after getData initiated the request
           $timeout(function(){
               cb(null, !$scope.isEventDone);
               // if second param is true, call `getData()` again otherwise, end the loop
           }, 5000);

       }, function(err) {
           console.log(err);
           // if you're here, either error has occurred or 
           // the loop has ended with `$scope.isEventDone = true`
       });


    });