Javascript не выдает ошибку при попытке вызвать get на объекте - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь внедрить службу, использующую AngularJS для управления cookie-файлами.

angular
    .module('myModule')
    .service('CookiesService', ['$cookies', function ($cookies) {

        var cookies = {
            cookie1: {},
            cookie2: {}
        };

        function CookiesService() {
        }

        CookiesService.prototype.update= function(name, options) {
            cookies[name] = options ? options : {};
        };


        CookiesService.prototype.isCookie = function(name) {
            if(!cookies.hasOwnProperty(name)) {
                throw 'Unknown cookie name';
            }
            return cookies.hasOwnProperty(name);
        };

        function getter(prototype, name, getter) {
            Object.defineProperty(prototype, name, {
                get:getter, 
                enumerable: true,
                configurable: true,
            });
         }

         Object.keys(cookies).forEach(function(name) {
             getter(CookiesService.prototype, name, function() {
                 try {
                      CookiesService.prototype.isCookie(name);
                      return $cookies.get(name);
                  } catch (e) {
                      throw new Error('Invalid cookie'); // never thrown!
                  }
             });

             /*Setter code*/


             return new CookiesService();
         });
     }
]);

Таким образом, в основном, если я хочу получить cookie-файл после его установки, я просто вызову CookiesServices.

Howeber, если я попытаюсь вызвать getter, чтобы получить cookie, который не существует, я ожидаю получить ошибку в консоли.Так как у меня есть бросок, но кажется, что он не работает, и я не могу отладить и посмотреть, выполняется ли код на этом уровне или нет.

Пример: CookiesService.cookie3 <- дает мне неопределенныйошибка не выдается. </p>

Также при условии, что я сделаю следующее:

CookiesService.prototype.isCookie = function(name) {
return cookies.hasOwnProperty(name);
};

Object.keys(cookies).forEach(function(name) {
getter(CookiesService.prototype, name, function() {
 if (!CookiesService.prototype.isCookie(name)) {
    throw new Error("blabla");
}
  return $cookies.get(name);
});

не будет выдано сообщение об ошибке, если я попытаюсь вызвать CookiesService.cookie2

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Во-первых, было бы неплохо переименовать ваш function getter(){} в function createGetter(){}.Это облегчит понимание, особенно с последним параметром в указанной функции также с именем "getter".

Во-вторых, вы указали:

Howe [v] э-э, если я попытаюсь вызвать метод получения, чтобы получить cookie, который не существует ...

Этого просто не произойдет: помните, что ваш цикл foreach создает методы получения для существующие куки (материал, определенный в var cookies).В вашем сервисном объекте никогда не будет определен метод получения, который также не имеет соответствующего значения в cookies;таким образом, выполнение чего-то вроде CookiesService.cookie3 вообще не вызывает вызывающего.

Если подумать, как может вы ожидаете использовать код (например, get: function(){...}) для получающего)это никогда не было определено?

Таким образом, вызов CookiesService.cookie3 никогда не выполнит код, который вы настроили для существующих файлов cookie, и, следовательно, никогда не будет нарушать ваши ошибки.

То, что вы видите с 'undefined 'ошибка - JS буквально говорит вам, что это не функция, это не метод получения, это не свойство ... это не что-то определенное для объекта CookiesService.

0 голосов
/ 15 февраля 2019

Вы можете просто проверить неопределенность вместо ожидания ошибки.Да, в JavaScript вы можете получить доступ к неопределенному значению.Пока вы не попытаетесь получить доступ к значению в неопределенном, вы не получите ошибку

Object.keys(cookies).forEach(function(name) {
getter(CookiesService.prototype, name, function() {
  CookiesService.prototype.isCookie(name);
  if ($cookies.get(name) !== undefined) return $cookies.get(name)
  else throw new Error('Invalid cookie');
});
...