2016-08-09 10 views
3

Ich habe HTTP-Dienst, der Versprechen zu inspection2update.DamageTypeId Eigenschaft zurückgibt und weiter ausführen.angularjs HTTP-Dienst warten auf Daten

HTTP-Dienst:

function post(objectTypeId, damageDescription) { 
    var defer = $q.defer(); 
    $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription).then(function (response) { 
     defer.resolve(response.data); 
    }); 
    return defer.promise; 
} 

Hier, wie ich Dienst im Controller nennen:

inspection2update.DamageTypeId = damageTypesService.save(inspection2update.ObjectTypeId, self.dType); 

Aber ich muß warten, bis ich Daten aus dem Dienst erhalten und nur danach, weiter auszuführen.

Für diesen Zweck verwende ich $q Service innerhalb $ HTTP Resolver, aber immer noch versprech ich von meinem Service und keine Daten.

Was muss ich in meinem Code ändern, damit der Dienst auf Daten wartet?

Antwort

2

Sie geben ein Versprechen zurück, das behoben wird, nachdem der Aufruf http das Abrufen der Daten beendet hat. Der Verbraucher, der diesen Dienst verwendet, muss warten, bis das Versprechen gelöst ist, und then etwas mit den Daten tun.

Verwenden Sie die then Syntax, um die Versprechen, Daten zu empfangen und auszuführen weiter:

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(data) { 
    inspection2update.DamageTypeId = data; 
    // rest of execution... 
}); 

PS - soweit ich es sehen kann, ist kein Einsatz von $q in Ihrem Fall (es sei denn, Sie wollen mit den Daten mischen/mache Protokolle, etc ...). Sie können die $http zurückrufen wie:

function save(objectTypeId, damageDescription) { 
    return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 
2

Verwenden Sie das Beste aus Winkel promise mit $q

function save (objectTypeId, damageDescription) { 
    var deferred = $q.defer(); 

    $http({ 
    url: serviceAddress + "save/" + objectTypeId + "/" , 
    method: 'POST', 
    data: damageDescription 
    }) 
    .success(function (data) { 
    deferred.resolve(data); 
    }) 
    .error(function (data) { 
    deferred.resolve(data); 
    }); 

    return deferred.promise; 
} 

Und in Ihrem Controller Verwendung .then Funktion

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(response){ 
    /*use the response here 
    eg: inspection2update.DamageTypeId = response.id 
    */ 
    }) 
+0

Was ist der Punkt Ihrer deferred.resolved (Daten)? Daten werden bereits aufgelöst, wenn der Rückruf ausgelöst wird. –

2

Zunächst einmal, Sie haben Ihre Service-Methode namens post und Sie rufen eine Methode namens save. Ist das ein Fehler? Zweitens, sehe ich keinen Grund, warum Sie den $http Service verwenden sollten, ist es niedriges Niveau und Ihre Anforderung ist einfach. Sie sollten $resource auschecken es bietet eine höhere Abstraktionsebene und wird für einfache Anfragen wie Ihre arbeiten. Nun zu deinem Problem. sowohl $http als auch $resource geben immer ein Versprechen zurück. In der Regel stellen Sie in Ihrem Dienst oder Controller einen Rückruf bereit, der die von der Anforderung empfangene Antwort übernimmt und verarbeitet. Da der Ansatz für $ resource und $http ähnlich sind, aber Sie nach $http gefragt haben, zeige ich Ihnen $http.

function post(objectTypeId, damageDescription) { 
return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 

nun in Ihrem Controller rufen Sie die Service-Methode post() wie diese.

damageTypesService.post(inspection2update.ObjectTypeId, self.dType).then(mycallback); 


function myCallback(response){ 
    inspection2update.DamageTypeId = response; // DamageTypeId now won't be populated until the request is resolved. 
} 
+0

Ich versuche, es in meinem Beispiel für get zu verwenden und es ist dosent Arbeit – Michael

+0

Bitte geben Sie den Code für Ihr Beispiel mit diesen Änderungen. Und erklären, was "es nicht funktioniert" bedeutet. Welche Fehler erhalten Sie? –