⊗jsSpExcDAE 148 of 294 menu

Прыклад выключэння з 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 выведзьце розныя паведамленні аб памылцы для выключэнняў розных тыпаў.

nlpthyhuru