Migrującę kod z Silverlight do Angularjs. Mój kod Silverlight w zasadzie próbował trafić usługę internetową. Jeśli zawiodło, poczekałoby trochę i spróbuj ponownie. Spróbuje tego trzy razy. Teraz próbuję to zrobić w Angularjs.

Z mojego zrozumienia powinienem użyć usługi AngularJS, aby trafić moją usługę internetową. Z mojego zrozumienia obietnice są używane. W tym czasie mam następującą usługę:

'use strict';
myApp.service('$myService', function($rootScope, $http) {
  this.queryAttempt = 0;
  this.findRecent = function() {
    this.queryAttempt = 0;
  };

  this.attemptToGetRecent = function() {
    try {
      this.queryAttempt = this.queryAttempt + 1;
      if (this.recentQueryAttempt < 3) {
        $http.get('http://www.someserver.com/endpoint');        
      } else {
        console.log('signal failure');
      }
    } catch (ex1) {
      console.log('Error Finding Recent (2).');
    }
  };
});

Ze względu na fakt, że obietnice są używane, jestem trochę zagubiony. W Silverlight stworzyłem wydarzenia. Mój kontroler zadzwoni do $ myservice.findrecen (). Chcę wykryć sukces i porażkę. Jednak potrzebuję też niektórych rerycji logiki. Gdybym nie potrzebował logiki ponownej próby, wystarczy użyłbym powrotu $ http.get (...) w funkcji wyszukiwania. Jednak z potrzebą Retry Logic nie wiem, jak strukturować moje obietnice, tak że kontroler jest świadomy a) sukcesu i b) porażkę, jeśli próbowano i nie powiodło się trzy próby.

Czy ktoś może mi pokazać, jak rozwiązać ten scenariusz w świecie obietnic?

0
JQuery Mobile 14 sierpień 2014, 17:08

2 odpowiedzi

Najlepsza odpowiedź

Pozwól mi opublikować kod, jak to zrobić z komentarzem poniżej:

myApp.service('myService', function($rootScope, $http, $q) {

    var findRecent - function() {

        var deferred = $q.defer();

        attemptToGetRecent(0, deferred);

        return deferred.promise;
    };


    var attemptToGetRecent = function(count, deferred) {
        $http.get('http://www.someserver.com/endpoint')
             .success(function (response) {
                deferred.resolve(response);
             })
             .error(function() {
                if (count >= 3) {
                    deferred.reject();
                } else {
                    attemptToGetRecent(count++, deffered);
                }
             });
    };
});
  1. W usłudze Uzyskaj instancję $q usługa, utwórz obiekt odroczony (obietnica) sam.
  2. Przekazać go jako parametr do attemptToGetRecent funkcja, która będzie powołaj się same rekurencyjnie, dopóki nie będzie też liczby wysiłków wysoki.
  3. Funkcja attemptToGetRecent Spróbuje zadzwonić do serwera, jeśli Sukces rozwiązuje obietnicę z danymi. Jeśli połączenie się nie powiedzie, Zostanie wywoływany ponownie do 3 zegarów, a następnie odrzucenie obietnicy

Konsument tego kodu użyłby go w ten sposób:

myService.findRecent()    
    .then(function (data) {
        console.log(data);
        $scope.videos = data.feed.entry;
      }, function() {
        console.log("error");
      });       
    }; 

Dla łatwiejszego czytania usunęłem rejestrowanie konsoli. Oczywiście można dodać. Jest to również dobry zwyczaj nie nazywać własnych usług z wiodącą $, jest to zarezerwowane dla usług kątowych.

Przykład roboczy: http://codepen.io/anon/pen/kncfj

1
David Bohunek 15 sierpień 2014, 07:51

Możesz wstrzyknąć $ Q i użyć go, aby dokonać własnej obietnicy i stworzyć funkcję rekurencyjną do obsługi prób.

Oto jakiś kod, który powinien pomóc:

'use strict';
myApp.service('$myService', function ($rootScope, $http, $q) {
    this.getRecent = function(){
        var deferred = $q.defer();
        var attempts = 0;
        (function queryRecent(attempts, error){
            if(attempts >= 2){
                // the $http.get() failed 3 times
                deferred.reject(error);
            }else{
                $http.get('http://www.someserver.com/endpoint').then(function(response){
                    // success -> resolve any data you want
                    deferred.resolve({
                        attempts: attempts,
                        response: response
                    });
                }).catch(function(error){
                    // failed, retry the queryRecent recursive function
                    queryRecent(attempts + 1, error); // pass attempts + 1 and the error object
                });
            }
        })(attempts, ''); // initially pass 0 and '' to the queryRecent recursive function
        return deferred.promise;
    };
});

myApp.controller('MyCtrl', function($scope, $myService){
    $myService.getRecent().then(function(data){
        // success -> use data
        console.log(data);
    }).catch(function(error){
        // the $http.get() failed 3 times
        console.log(error);
    });
});
0
mobabur94 14 sierpień 2014, 13:38