2016-04-05 4 views
0

Ich versuche, $http.get() in einer Fabrik zu verwenden, um einen Wert abzurufen, der in einer Steuerung weiterverarbeitet wird.Warten bis Erfolg oder Fehler auftritt

appFac.factory('CompletedJobs',function($http){ 
var result; 
    return{ 
     getJobs : function(webserviceurl){ 
      $http.get(webserviceurl).success(function(data){ 
       result = data; 
      }) 
      .error(function(err){ 
       result = ''; 
      }); 
      return result; 
     } 
    } 
}) 

appCtrl.controller('Ctrl',function(CompletedJobs){ 
    var data = CompletedJobs.getJobs('some url'); 
    // some other logic based on data 
}); 

Aufgrund der Asynchronität, durch die Zeit, die Daten in der Factory-Methode zur Verfügung stehen, ist es von keinerlei Nutzen für die Steuerung, weil die Factory-Methode bereits undefined zurückgekehrt ist.

Kann mir jemand helfen, herauszufinden, wie man die Daten von der Fabrikmethode bekommt, damit es vom Controller verwendet werden kann?

+2

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous- Anruf) – Phil

Antwort

0

In der Fabrik zurück das Versprechen.

appFac.factory('CompletedJobs',function($http){ 
return { 
    getJobs : function(webserviceurl){ 
     //return the promise 
     return $http.get(webserviceurl); 
    } 
}; 

In der Steuerung Kette vom Versprechen.

appCtrl.controller('Ctrl',function(CompletedJobs){ 
    var promise = CompletedJobs.getJobs('some url'); 

    promise.then(function onFulfilled(result) { 
     var data = result.data 
     // some other logic based on data 
    }).catch(function onRejection(result) { 
     console.log(result.status); 
    }); 
}); 
1

In Ihrem Werk sollten Sie die Aussicht auf Erfolg oder Fehler zurück, anstatt ausdrücklich das Ergebnis der Rückkehr, denn das zurückgegeben wird, bevor Ihr Versprechen gelöst bekommen. Ändern Sie Ihre Fabrik so.

appFac.factory('CompletedJobs',function($http, $q){ 
    return{ 
     getJobs : function(webserviceurl){ 
      var deferred = $q.defer(); 
      $http.get(webserviceurl).then(function(response){ 
       deferred.resolve(response.data); 
       return deferred.promise; 
      }); 
     } 
    } 
}) 

appCtrl.controller('Ctrl',function(CompletedJobs){ 
    var data = CompletedJobs.getJobs('some url'); 
    // some other logic based on data 
}); 

Dies sollte für Sie arbeiten.