Как передать результат обещания контроллеру в AngularJS

0

В контроллере мне нужно получить статус сегмента. Сегменты загружаются из API с использованием $resource.

В ресурсе у segmentsresource.js есть:

angular.module('appApp')
  .factory('SegmentsResource', function ($resource) {
    return $resource('http://localhost:3000/api/v1/segments/:id');
  });

В сервисе, segmentsservice.js меня есть:

angular.module('appApp')
  .service('SegmentsService', function (SegmentsResource) {
    this.getSegmentStatus = function(segmentId) {
      return SegmentsResource.get({
        id: segmentId
      }, function(segment) {
        return segment.status;
      })
    };
  });

Я пытаюсь выполнить return segment.status поэтому я могу использовать результат ("доступный", "переведенный" и т.д.) В контроллер, main.js:

$scope.checkAndEditSegment = function(segmentId) {
  SegmentsService.getSegmentStatus(segmentId)
    .then(function(status) {
      if (status === 'available') {
        console.log('segment is available');
      }
    });
};

Однако это не работает. Консольные плюсы: TypeError: Cannot read property 'then' of undefined', поэтому у меня есть проблема с обещаниями.

Как это исправить?

  • 0
    Не могли бы вы предоставить вывод console.log(SegmentsService.getSegmentStatus(segmentId)) в методе $scope.checkAndEditSegment ? Обратите внимание, что обещание доступно через $promise , см. Docs.angularjs.org/api/ngResource/service/$resource
  • 0
    В SegmentsService возвращайте SegmentsResource.get(....).$promise , или в SegmentsService.getSegmentStatus(segmentId) используйте SegmentsService.getSegmentStatus(segmentId).$promise , потому что теперь вы просто возвращаете объект.
Теги:
promise
angular-promise

2 ответа

1

Но почему вы берете этот длинный маршрут, когда можете просто вызвать фабрику с контроллера.

angular.module('appApp')
  .factory('SegmentsResource', function ($resource) {
    return $resource('http://localhost:3000/api/v1/segments/:id');
  });

$scope.checkAndEditSegment = function(segmentId) {
  SegmentsResource.get(segmentId)
    .then(function(status) {
      if (status === 'available') {
        console.log('segment is available');
      }
    });
};
  • 0
    потому что я хочу использовать getSegmentStatus в разных контроллерах, поэтому он внутри службы.
  • 0
    но вы всегда можете использовать SegmentsResource в разных контроллерах
0

Я решил использовать $q:

В сервисе:

this.getSegmentStatus = function(segmentId) {
  var dfd = $q.defer();

  SegmentsResource.get({ id: segmentId }, function(segment) {
    dfd.resolve(segment.status);
  })

  return dfd.promise;
};

В контроллере:

SegmentsService.getSegmentStatus(segmentId)
    .then(function(status) {
      console.log(status);
    });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню