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?

1
Rodrigo Galindez 21 Aug. 2015 im 17:43

3 Antworten

Beste Antwort

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');
    }
});
2
Gustav 21 Aug. 2015 im 14:54

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);
        }

    };
0
cmgsakell 21 Aug. 2015 im 15:03

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.

2
Long Nguyen 21 Aug. 2015 im 14:51