我正在尝试使用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。
但是,如果我尝试调用getter来检索不存在的cookie,我希望在控制台中出现错误。因为我有抛出,但它似乎无法正常工作,我无法调试并查看代码是否在此级别执行。
示例:CookiesService.cookie3 < - 给我未定义,没有抛出错误。
还假设我做如下:
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,它不会抛出blabla错误
首先,将function getter(){}
重命名为function createGetter(){}
可能是个好主意。这将使事情更容易理解,特别是在所述函数的最后一个参数上也称为“getter”。
其次,你说:
Howe [v]呃,如果我试图调用getter来检索不存在的cookie ...
这根本不会发生:记住你的foreach
循环正在为现有的cookie(在var cookies
下定义的东西)创建getter。在cookies
下,服务对象上永远不会有一个getter,它也没有相应的值;因此,做像CookiesService.cookie3
这样的事情根本就不是一个吸气剂。
如果你考虑一下,你怎么能期望运用代码(例如,get: function(){...})
用于从未被定义的吸气剂?
所以调用CookiesService.cookie3
将永远不会执行您为现有cookie设置的代码,因此永远不会破坏您的错误抛出。
你所看到的'undefined'错误是JS从字面上告诉你它不是一个函数,它不是一个getter,它不是一个属性......它不是在对象CookiesService
上定义的任何东西。
您只需检查undefined而不是等待错误。在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');
});