Можно ли запустить службу опроса по телефону ? AngularJS

я написал службу опроса в AngularJS и хочу запустить службу, если мой почтовый запрос сделан.Но если я вызываю gui, служба опроса активна.

я пытаюсь реализовать функцию запуска, функцию завершения и вызвать функцию start (), если запрос post сделан.. но это не работает :/

Мой опрос :

.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);
            });     
    };
}])

2 ответа

  1. Вы пытаетесь позвонить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);
    });
    

    Теперь yournotification.poller-возвращаемое значение $intervalфункции.
    Чтобы заставить его работать, вы должны обернуть функцию так, чтобы вы могли фактически передать ему идентификатор.

  2. Одна проблема что $interval()вызвано немедленно на впрыске в ваш регулятор. Ваша догадка внедрить метод «Start» или что — то подобное была хорошей-но вы, вероятно, можете упростить ее еще больше, позволив фабрике вернуть функцию. Затем вы можете просто создать экземпляр этой функции в контроллере столько раз, сколько вам нужно для опроса.

    Однако есть и другие проблемы. Обещание может быть разрешено только один раз, и так как вы выполняете HTTP-запрос несколько раз, я предполагаю, что вы хотите быть «уведомлены» об изменениях состояния, пока состояние не помечено как «сделано». В настоящее время ответственность за проверку состояния возлагается на контроллер. Если все, что вы хотите, чтобы быть уведомлены об» ошибке «и» успех » шаги, однако, вероятно, гораздо лучше, чтобы позволить Poller служба несет ответственность за интерпретацию информации о состоянии, которая возвращается из вашей службы, и просто зависит от стандартного поведения обещания в вашем контроллере. Я решил показать пример последнего случая:

    Обновление: образец plnkr здесь: http://plnkr.co/edit/e7vqU82fqYGQuCwufPZN?p=preview

    angular.module('MYMODULENAMEHERE')
    .factory('NotificationPoller',
        ['$http', '$q', '$interval',
        function ($http, $q, $interval) {
    
            return poller;
    
            function poller(id) {
                var _this = this;
                var deferred = $q.defer();
    
                var interval = $interval(function() {
                    $http
                        // I assumed you actually want to use the value of 'id' in your
                        // url here, rather than just the word 'id'.
                        .get('http://localhost:9999/v1/jmeter/' + id, {cache: false})
                        .then(function(data, status, headers, config) {
                            // I commented out the following statement. It is meaningless because
                            // you can't do anything with the return value since it's an anonymous
                            // function you're returning it from. Instead, you probably meant to 
                            // use the promise to return the data.
    
                            // return data;
    
                            if(data.status == "SETUP") {
                                deferred.notify(data);
                            }
                            else if(data.status == "TEST") {
                                deferred.notify(data);
                            }
                            else if(data.status == "DONE") {
                                _this.endPolling(); // Automatically stop polling when status is done
                                deferred.resolve(data);
                            }
                            else { // data.status == "ERROR" (or anything else that's not expected)
                                _this.endPolling(); // Automatically stop polling on error
                                deferred.reject(data);
                            }                       
                        }, function(data) {
                            _this.endPolling();
                            deferred.reject(data);
                        });
                }, 10000);
    
                this.endPolling = function() {
                    $interval.cancel(interval);
                };
    
                // Make the promise available to calling code
                this.promise = deferred.promise;
            };
    }])
    

    Теперь ваш контроллер может гораздо проще использовать ваш сервис опроса. Вот пример разделенного контроллера, использующего вашу службу опроса, для ясности:

    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"
            };
    
        }]);
    

    Как вы видите, фабрика получила немного больше ответственности таким образом, но вашему контроллеру больше не нужно знать детали всех статусов, которые может отправить сервер. Он просто использует стандартные обещания.