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