"TypeError: Невозможно прочитать свойство" then "неопределенного значения

В настоящее время я обновляю свое приложение ionic v1 до ionic v2, но у меня проблемы с сервисом на основе обещаний.

ионный v1

home.controller.js

angular.module('myApp.home', ['myApp.services.camera',])

.controller('HomeCtrl', function($scope, CameraService) {
  $scope.getPicture = function() {
    var onSuccess = function(result) {
      // Some code
    };

    var onError = function(err) {
      // Some code
    };

    CameraService.getPicture().then(onSuccess, onError);
  };
});

camera.service.js

angular.module('myApp.services.camera', [])

.service('CameraService', function($q, $ionicPlatform, $cordovaCamera) {
  return {
    getPicture : function() {
      var deferred = $q.defer();

      var onSuccess = function(result) {
        deferred.resolve(result);
      };

      var onError = function(err) {
        deferred.reject(err);
      };

      // my options here

      $ionicPlatform.ready(function() {
        $cordovaCamera.getPicture(options).then(onSuccess, onError);
      });

      return deferred.promise;
    }
  };
});

Это хорошо работает.

Теперь с версией v2.

ионный v2

take-photos.ts

import {Page, NavController} from 'ionic-angular';
import {CameraService} from '../../services/camera.service';

@Page({
  templateUrl: 'build/pages/take-photos/take-photos.html',
  providers: [CameraService]
})
export class TakePhotosPage {

  constructor(private cameraService: CameraService) {}

  getPicture () {
    this.cameraService.getPicture().then((result) => {
      console.log(result); // Did not called
      // Some code
    }, (err) => {
      // Some code
    });
  }
}

camera.service.ts

import {Injectable} from 'angular2/core';
import {Platform} from 'ionic-angular';

@Injectable()
export class CameraService {
  constructor (private platform: Platform) {}

  getPicture () : any {
    // my options here

    this.platform.ready().then(() => {
      navigator.camera.getPicture((result) => {
        console.log(result); // Called
        return Promise.resolve(result);
      }, (err) => {
        return Promise.reject(err);
      }, options);
    });
  }
}

С v1 обещание возвращается правильно. С v2 я получил ошибку: TypeError: Cannot read property 'then' of undefined в take-photos.ts для этой строки this.cameraService.getPicture().then

Я не понимаю, почему, когда я следовал угловому руководству по услугам и обещаниям

Если у кого-то есть идея, это было бы действительно полезно.


person Fenkiou    schedule 02.03.2016    source источник


Ответы (1)


Вы пропустили возврат обещания из getPicture функции, так что вы можете использовать .then функцию поверх него.

Код

getPicture () : any {
    // my options here

    return this.platform.ready().then(() => {
      navigator.camera.getPicture((result) => {
        console.log(result); // Called
        return Promise.resolve(result);
      }, (err) => {
        return Promise.reject(err);
      }, options);
    });
}
person Pankaj Parkar    schedule 02.03.2016
comment
Рад помочь вам. Спасибо ;-) - person Pankaj Parkar; 04.03.2016
comment
На самом деле это не работает. Я имею в виду, что у меня больше нет ошибки, но теперь console.log () в take-photos.ts вызывается раньше, чем в camera.service.ts. Это не ожидание обещания. Может это другой вопрос? Я покопаюсь в этом. - person Fenkiou; 04.03.2016
comment
Я был неправ, когда делал это. Этот ответ мне помог. Теперь у меня такое же поведение, как и у моей службы ionic v1. - person Fenkiou; 08.03.2016