Прыклад выключэння з data- атрыбутамі ў JavaScript
Няхай пры загрузцы старонкі сервер стварае HTML код, у якім захоўваецца назва, цана і колькасць купленага прадукту:
<div id="product" data-product="яблык" data-price="1000" data-amount="5"></div>
Давайце зробім функцыю, якая будзе прымаць спасылку на элемент з прадуктам і знаходзіць поўную кошт тавару (цану памнажаць на колькасць):
function getCost(elem) {
return elem.dataset.price * elem.dataset.amount;
}
Знайдзем кошт нашага прадукту:
let product = document.querySelector('#product');
let cost = getCost(product);
alert(cost);
Выкажам здагадку цяпер наступную сітуацыю: з-за якога-небудзь збою на серверы ён даслаў нам тавар, у якім адсутнічае цана або колькасць (або абодва адразу), напрыклад, вось так:
<div id="product" data-product="яблык" data-price="1000"></div>
Калі цяпер паспрабаваць палічыць кошт тавару, то выніку на экран выведзецца NaN. Згодзіцеся, не вельмі інфарматыўна.
Атрымліваецца, нам трэба як-небудзь абараніцца ад таго, што будуць адсутнічаць патрэбныя нам атрыбуты. Гэта можна зрабіць двума шляхамі. Першы шлях - гэта сказаць, што гэта нармальная паводзіны і проста правяраць іфамі наяўнасць патрэбных нам атрыбутаў:
function getCost(elem) {
if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
return elem.dataset.price * elem.dataset.amount;
} else {
return 0; // вернем што-небудзь, напрыклад, 0 або null або false
}
}
Другі варыянт - гэта сказаць, што адсутнасць
атрыбута data-price або data-amount
- выключная сітуацыя. У гэтым выпадку
мы будзем выкідваць выключэнне:
function getCost(elem) {
if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
return elem.dataset.price * elem.dataset.amount;
} else {
throw {
name: 'ProductCostError',
message: 'адсутнічае цана або колькасць у прадукту'
};
}
}
Які з двух варыянтаў тут прыдатней прымяніць - гэта выбар праграміста. Ён можа лічыць праблему нармальнай працай скрыпта або выключнай сітуацыяй.
Няхай мы вырашылі, што сітуацыя выключная. Тады код атрымання кошту тавару будзе выглядаць вось так:
let product = document.querySelector('#product');
try {
let cost = getCost(product);
alert(cost);
} catch (error) {
// як-небудзь рэагуем на выключэнне
}
Перарабіце мой код так, каб функцыя getCost
выкідвала два тыпы выключэнняў: калі адсутнічае
цана і калі адсутнічае колькасць. Добра
падумайце над назвамі гэтых выключэнняў.
У блоку catch выведзьце розныя паведамленні аб
памылцы для выключэнняў розных тыпаў.