Ich habe Probleme, Versprechen zu verstehen. Ich habe eine Funktion $scope.startJob
, die beim Aufruf areThereAvailableSegments
im SegmentsService
aufruft. Die Idee ist, dass areThereAvailableSegments
true oder false zurückgeben sollte, damit ich mit diesem Verhalten im Controller umgehen kann, aber nicht sicher bin, wie ich das machen soll.
areThereAvailableSegments
ruft getSegments()
auf, das Textsegmente aus der Datenbank anfordert. getSegments
gibt ein Versprechen zurück, und ich versuche, dieses Versprechen mit .then
in areThereAvailableSegments
zu behandeln, bin mir aber nicht sicher, wie ich es an den Controller weitergeben soll.
Hier ist meine Segmentfabrik, die das $resource
-Objekt segmentsfactory.js
zurückgibt:
angular.module('appApp')
.factory('SegmentsFactory', function ($resource) {
return $resource('http://localhost:3000/api/v1/segments/:id');
});
Hier ist mein Segmentdienst, segmentsservice.js
:
angular.module('appApp')
.service('SegmentsService', function (SegmentsFactory) {
// gets segments from mongo
this.getSegments = function(jobId) {
return SegmentsFactory.query({ job_id: jobId }).$promise;
};
// should return true/false if there are available segments
this.areThereAvailableSegments = function(jobId) {
var dump = [];
// queries for all segments
this.getSegments(jobId)
.then(function(segments) {
// dumps segments status in a temp array
for (var i = 0; i < segments.length; i++) {
dump.push(segments[i].status);
}
// returns true if there is an 'available' in the temp array
if (dump.indexOf('available') >= 0) {
return true;
} else {
return false;
}
});
};
});
Und hier ist mein Controller, main.js
:
$scope.startJob = function() {
if (SegmentsService.areThereAvailableSegments(jobId)) {
console.log('there are available segments, then trigger texteditor');
} else {
console.log('no segments to translate');
}
};
Bei der Ausführung zeigt die Konsole "Keine zu übersetzenden Segmente" an, da SegmentsService
weder true noch false zurückgibt.
Wie kann man das lösen?
3 Antworten
Die Funktion areThereAvailibleSegments
sollte ebenfalls ein Versprechen zurückgeben. Und dann haben Sie in Ihrem Controller einen Then-Fall und Ihr If-else dort.
this.areThereAvailableSegments = function(jobId) {
var dump = [];
// queries for all segments
return this.getSegments(jobId) //Return here
.then(function(segments) {
// dumps segments status in a temp array
for (var i = 0; i < segments.length; i++) {
dump.push(segments[i].status);
}
// returns true if there is an 'available' in the temp array
if (dump.indexOf('available') >= 0) {
return true;
} else {
return false;
}
});
};
Da Ihre Erfolgsfunktion true oder false zurückgibt, hat das Versprechen von areThereAvailibleSegments
- function diesen Booleschen Wert.
Dann in Ihrem Controller:
SegmentsService.areThereAvailableSegments(jobId).then(function(available){
if (available) {
console.log('there are available segments, then trigger texteditor');
} else {
console.log('no segments to translate');
}
});
Ich würde es so einrichten ... das Versprechen in Ihrer Fabrik erfüllen und dann die Daten in der Steuerung aufrufen.
In Ihren Diensten js:
.factory('SegmentsFactory', function ($resource) {
var APIRequest = {};
APIRequest.getSegments = function(id){
segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
return segmentAPI.get().$promise.then(function(segments){
console.log(segments);
return segments;
});
};
return APIRequest;
}]);
Und dann in Ihrem Controller:
var dump = [];
$scope.startJob = function() {
if (SegmentsService.areThereAvailableSegments) {
APIRequest.getSegments($scope.id).then(function(data){
if (data.error){
//error stuff here
} else {
if (data.segments.length > 0){
for(var i=0; i < segments.length; i++){
console.log(segments);
dump.push(segments[i].status);
}
};
Es gibt keinen Grund, sowohl den Service als auch die Fabrik zu haben. Entfernen Sie die Fabrik und verschieben Sie diesen Code in den Dienst. Für Ihr Problem müssen Sie das $ q-Modul verwenden, um ein Versprechen zurückzugeben. https://docs.angularjs.org/api/ng/service/ $ q
this.areThereAvailableSegments = function(jobId) {
var dump = [];
var deferred = $q.deferred;
// queries for all segments
this.getSegments(jobId)
.then(function(segments) {
// dumps segments status in a temp array
for (var i = 0; i < segments.length; i++) {
dump.push(segments[i].status);
}
// returns true if there is an 'available' in the temp array
if (dump.indexOf('available') >= 0) {
deferred.resolve(true);
} else {
deferred.resolve(false);
}
});
return deferred.promise;
};
Sie müssen sich dann mit dem Versprechen in der Steuerung befassen.