Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以通过电话启动投票服务吗?安格拉斯_Javascript_Angularjs_Polling - Fatal编程技术网

Javascript 我可以通过电话启动投票服务吗?安格拉斯

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

我已经用AngularJS编写了一个轮询服务,如果我的post请求完成,我想启动该服务。但是如果我调用gui,轮询服务是活动的

我尝试实现一个start函数,end函数,并在post请求完成时调用start()函数。。但它不起作用:/

我的投票服务:

.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"
        };

    }]);