Javascript 我可以通过电话启动投票服务吗?安格拉斯
我已经用AngularJS编写了一个轮询服务,如果我的post请求完成,我想启动该服务。但是如果我调用gui,轮询服务是活动的 我尝试实现一个start函数,end函数,并在post请求完成时调用start()函数。。但它不起作用:/ 我的投票服务:Javascript 我可以通过电话启动投票服务吗?安格拉斯,javascript,angularjs,polling,Javascript,Angularjs,Polling,我已经用AngularJS编写了一个轮询服务,如果我的post请求完成,我想启动该服务。但是如果我调用gui,轮询服务是活动的 我尝试实现一个start函数,end函数,并在post请求完成时调用start()函数。。但它不起作用:/ 我的投票服务: .factory('NotificationPollService', ['$http', '$q', '$interval', function ($http, $q, $interval) { var deferred = $q.de
.factory('NotificationPollService',
['$http', '$q', '$interval',
function ($http, $q, $interval) {
var deferred = $q.defer();
var notification = {};
notification.poller = $interval(function(id) {
$http.get('http://localhost:9999/v1/jmeter/id', {cache: false})
.success(function(data, status, headers, config) {
return data;
}, 10000);
});
notification.endPolling = function() {$interval.cancel(this.interval);};
}])
还有我发布请求的控制器
.controller('HomeController',
['$scope', '$rootScope', 'SendJmeterFile', 'NotificationPollService',
function ($scope, $rootScope, SendJmeterFile , NotificationPollService) {
$scope.upload = function() {
var customArtifacts = "";
var testDataBase = "";
if($scope.jmeterFile.customArtifact == undefined){
customArtifacts = null;
} else {customArtifacts = $scope.jmeterFile.customArtifact.base64}
if($scope.jmeterFile.testDataBase == undefined){
testDataBase = null;
} else {testDataBase = $scope.jmeterFile.testDataBase.base64}
SendJmeterFile.upload($scope.jmeterFile.jmeter.base64, customArtifacts, $scope.jmeterFile.customProperties, $scope.jmeterFile.instanceConfiguration, $scope.jmeterFile.instances, $scope.jmeterFile.providerID, testDataBase)
.then(function(data) {
alert("Daten erfolgreich verschickt!");
console.log(data);
NotificationPollService.poller(data.id)
//.then(function(data) {
/*if(data.status == "SETUP")
if(data.status == "TEST")
if(data.status == "DONE")
if(data.status == "ERROR")
}), function(data) {
})*/
}, function(data) {
alert("Fehler!");
console.log(data);
});
};
}])
您尝试调用
NotificationPollService.poller(data.id)
,实际上,这是因为之前在NotificationPollService
中您分配了notification.poller
类似的功能
notification.poller = $interval(function(id) {
$http.get('http://localhost:9999/v1/jmeter/id', {cache: false})
.success(function(data, status, headers, config) {
return data;
}, 10000);
});
现在,您的通知.poller
是$interval
函数的返回值。
要使其正常工作,您应该包装函数,以便实际向其传递id。一个问题是,
$interval()
在注入控制器后立即被调用。您实现“Start”方法或类似方法的预感是很好的,但是您可以通过让工厂返回函数来简化它。然后,只要需要轮询器,就可以在控制器中实例化该函数
然而,还有更多的问题。承诺只能解析一次,而且由于您多次执行HTTP请求,我猜您希望收到状态更改的“通知”,直到状态标记为“完成”。您当前正在将检查状态的责任交给控制器。但是,如果您只希望收到“错误”和“成功”步骤的通知,那么最好让轮询器
服务负责解释从您的服务返回的状态信息,并且只依赖于控制器中的标准承诺行为。我选择展示后一种情况的一个例子:
更新:此处为示例plnkr:
现在,控制器可以更轻松地使用轮询服务。以下是一个使用您的轮询服务的精简控制器示例,为清楚起见:
angular.module('MYMODULENAMEHERE')
.controller('HomeController', [
'NotificationPoller',
function(NotificationPoller) {
var some_id = 207810;
var poller = new NotificationPoller(some_id);
poller.promise.then(onSuccess, onError, onNotify);
function onSuccess(data) {
// data.status == "DONE"
};
function onError(data) {
// data.status == "ERROR"
};
function onNotify(data) {
// data.status == "TEST" || data.status == "SETUP"
};
}]);
如您所见,工厂通过这种方式承担了更多的责任,但是您的控制器不需要知道后端可以发送的所有状态的详细信息。它只使用标准承诺。如果我删除NotificationPollService.poller(data.id),那么如果我上传文件,interval函数仍然处于活动状态:/wrap函数的含义是什么?iI假定警报(“Daten erfolgreich verschickt!”)实际上警报了一个字符串。是吗?是的,这对我来说只是一个通知,我看到post请求工作^SendJmeterFile.upload是一个工厂方法,它将使json请求取决于输入字段。一旦您在代码中调用$interval,它就会启动,因此它与您的请求没有任何共同之处,成功与否。尝试减少间隔超时,并使用ChromeDevTools进行调试,然后查看所谓的首次请求成功回调或间隔回调。要使您的interval函数在请求成功回调时运行,您应该执行以下操作:notification.poller=function(id){return$interval(…)}谢谢您的帮助!我尝试了一下,得到了错误,NotificationPollService不是构造函数,我可以在SendJMeterFile.upload.then中初始化NotificationPollService吗。。成功功能?这是我的任务的一个很好的案例场景:将文件发送到服务器,服务器执行文件并设置状态取决于服务器所处的步骤(运行、完成、错误、测试),在此期间,我希望使用服务器响应的id轮询服务。所以我想我在发帖后给投票服务打电话询问成功案例,还是我错了?是的,这是我根据你最初的代码做出的假设。我不确定您为什么会收到这个错误,尽管这可能与您可能直接复制了我的代码有关?它不会工作,因为在示例脚本中,我没有定义角度模块。我已经为您创建了一个Plnkr,它可以正常工作(当然不包括实际的后端),所以也许您可以看看它是否对您更有用:非常感谢,我现在已经解决了它,问题是,我将notificationservice注入了success fall:/,您的解决方案非常优雅简单,非常感谢!
angular.module('MYMODULENAMEHERE')
.controller('HomeController', [
'NotificationPoller',
function(NotificationPoller) {
var some_id = 207810;
var poller = new NotificationPoller(some_id);
poller.promise.then(onSuccess, onError, onNotify);
function onSuccess(data) {
// data.status == "DONE"
};
function onError(data) {
// data.status == "ERROR"
};
function onNotify(data) {
// data.status == "TEST" || data.status == "SETUP"
};
}]);