Ich habe das folgende Code-Muster, wobei ein Update-Aufruf jedes Mal vorgenommen wird, wenn der Benutzer die Daten in der Ansicht aktualisiert.Zweiter Aufruf zum Versprechen wird ausgeführt, bevor das Versprechen zurückkehrt - Angular Javascript
// FACTORY SERVICE CODE
.factory('updateService', ['$http', '$q', function($http, $q){
var df = $q.defer();
var updateData = function(uriName, dataObj){
$http({
method: 'PUT',
data: dataObj,
url: uriName
}).then(function successCallback(response) {
console.log('from put');
console.log(response.data);
df.resolve(response.data);
}, function errorCallback(response) {
console.log('Error', response.data);
df.reject(response.data);
});
return df.promise;
}
return {updateData:updateData};
}])
// CONTROLLER CODE
.controller('MainCtrl', ['$scope','updateService', function($scope, updateService) {
$scope.saveToServer = function(){
var tmpObj = {data: $scope.dataOne, anotherData: $scope.dataTwo};
myService.updateData(uriName, tmpObj).then(function(resolved) {
console.log('CONTROLLER');
$scope.myData = resolved;
console.log($scope.myData);
console.log('end');
}, function(rejected){
console.log('put rejected');
});
});
$scope.btnUpdateClick = function(){
$scope.saveToServer();
};
}]);
PROBLEM: Wenn der Benutzer eine Aktualisierungsanforderung zum ersten Mal macht, funktioniert der Code wie erwartet. Aber wenn der Benutzer danach aktualisiert, führt der "aufgelöste Versprechen" -Code (im Controller) FIRST aus und dann wird der $ http-Code (im Service) ausgeführt.
Beispiel für die Ausgabe von btnUpdateClick gemacht ZWEIMAL mit genügend Abstand in-between:
from put
Array [ Object, Object]
CONTROLLER
Array [ Object, Object]
end
CONTROLLER
Array [ Object, Object]
end
from put
Array [ Object, Object]
FRAGE: bitte ich darauf hinweisen, wo ich einen Fehler mache?
Ist das Problem wegen PUT Anfrage?
oder ist es möglich, die Ausführungswarteschlange wie erwartet zu korrigieren, durch $ apply oder ähnliches?
'var df = $ q.defer(); 'verschiebe diesen Code in die' updateData'-Funktion und ein anderer Vorschlag ist, warum du separate Versprechen für $ http-Aufruf erstellst. Gib einfach das $ http Versprechen zurück. –
@ pragaas wäre es besser, die Antwort nach dem Upvoting zu akzeptieren :) –
@ARUN - zu Recht hingewiesen. – Mikki