JavaScript може вÑдпÑавлÑÑи меÑÐµÐ¶ÐµÐ²Ñ Ð·Ð°Ð¿Ð¸Ñи на ÑеÑÐ²ÐµÑ Ñа пÑдванÑажÑваÑи Ð½Ð¾Ð²Ñ ÑнÑоÑмаÑÑÑ Ð·Ð° поÑÑебоÑ.
ÐапÑиклад, можна викоÑиÑÑовÑваÑи меÑежевий запиÑ, Ñоб:
- ÐÑдпÑавлÑÑи замовленнÑ,
- ÐаванÑажиÑи ÑнÑоÑмаÑÑÑ Ð¿Ñо коÑиÑÑÑваÑа,
- ÐÑÑимаÑи оÑÑÐ°Ð½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð· ÑеÑвеÑа,
- â¦Ñ Ñ.д.
â¦Ð вÑе Ñе без пеÑезаванÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑÑоÑÑнки!
РзагалÑний ÑеÑмÑн âAJAXâ (абÑевÑаÑÑÑа вÑд Asynchronous JavaScript And XML) Ð´Ð»Ñ Ð¼ÐµÑÐµÐ¶ÐµÐ²Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑв вÑд JavaScript кодÑ. Ðле ÑоÑÐ¼Ð°Ñ XML викоÑиÑÑовÑваÑи не обовâÑзково: Ñей ÑеÑмÑн заÑÑаÑÑлий, ÑÐ¾Ð¼Ñ Ñе Ñлово (XML) ÑÑÑ. Ðожливо, ви вже його деÑÑ ÑÑли.
РкÑлÑка ÑпоÑобÑв надÑÑлаÑи меÑежевий Ð·Ð°Ð¿Ð¸Ñ Ñ Ð¾ÑÑимаÑи ÑнÑоÑмаÑÑÑ Ð· ÑеÑвеÑа.
ÐеÑод fetch() â ÑÑÑаÑний Ñа дÑже поÑÑжний, ÑÐ¾Ð¼Ñ Ð¿Ð¾Ñнемо з нÑого. ÐÑн не пÑдÑÑимÑÑÑÑÑÑ ÑÑаÑими (можна викоÑиÑÑовÑваÑи полÑÑÑл), але пÑдÑÑимÑÑÑÑÑÑ Ð²ÑÑма ÑÑÑаÑними бÑаÑзеÑами.
Ðазовий ÑинÑакÑиÑ:
let promise = fetch(url, [options])
urlâ URL Ð´Ð»Ñ Ð²ÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑ.optionsâ додаÑÐºÐ¾Ð²Ñ Ð¿Ð°ÑамеÑÑи: меÑод, заголовки Ñ Ñ.д.
Ðез options, Ñе пÑоÑÑо GET запиÑ, Ñкий заванÑажÑÑ Ð·Ð¼ÑÑÑ Ð·Ð° адÑеÑÐ¾Ñ url.
ÐÑаÑÐ·ÐµÑ Ð¾Ð´ÑÐ°Ð·Ñ Ð¿Ð¾ÑÐ¸Ð½Ð°Ñ ÑобиÑи Ð·Ð°Ð¿Ð¸Ñ Ñа повеÑÑÐ°Ñ Ð¿ÑомÑÑ, Ñкий зовнÑÑний код викоÑиÑÑовÑÑ Ð´Ð»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑезÑлÑÑаÑÑ.
ÐÑоÑÐµÑ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð·Ð°Ð·Ð²Ð¸Ñай вÑдбÑваÑÑÑÑÑ Ñ Ð´Ð²Ð° еÑапи.
Ðо-пеÑÑе, promise завеÑÑиÑÑÑÑ Ñз обâÑкÑом вбÑдованого клаÑÑ Response Ñ ÑкоÑÑÑ ÑезÑлÑÑаÑÑ, одÑÐ°Ð·Ñ ÐºÐ¾Ð»Ð¸ ÑеÑÐ²ÐµÑ Ð½Ð°Ð´ÑÑле заголовки вÑдповÑдÑ.
Ðа ÑÑÐ¾Ð¼Ñ ÐµÑÐ°Ð¿Ñ Ð¼Ð¾Ð¶Ð½Ð° пеÑевÑÑиÑи ÑÑаÑÑÑ HTTP-запиÑÑ, Ñа визнаÑиÑи, Ñи виконавÑÑ Ð²Ñн ÑÑпÑÑно, а Ñакож пеÑеглÑнÑÑи заголовки, але поки Ñо без ÑÑла запиÑÑ.
ÐÑомÑÑ Ð·Ð°ÐºÑнÑÑÑÑÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ, ÑкÑо fetch не змÑг виконаÑи HTTP-запиÑ, напÑиклад, ÑеÑез Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ Ð¼ÐµÑÐµÐ¶Ñ Ð°Ð±Ð¾, ÑкÑо Ñакого ÑайÑÑ Ð½Ðµ ÑÑнÑÑ. ÐеноÑмалÑÐ½Ñ HTTP-ÑÑаÑÑÑи, Ñк 404 Ñа 500, не викликаÑимÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ.
Ðи можемо побаÑиÑи HTTP-ÑÑаÑÑÑ Ñ Ð²Ð»Ð°ÑÑивоÑÑÑÑ Ð²ÑдповÑдÑ:
statusâ код ÑÑаÑÑÑа HTTP-запиÑÑ, напÑиклад, 200.okâ логÑÑне знаÑеннÑ, коÑÑе бÑдеtrue, ÑкÑо код HTTP-ÑÑаÑоÑÑ Ð² дÑÐ°Ð¿Ð°Ð·Ð¾Ð½Ñ 200-299.
ÐапÑиклад:
let response = await fetch(url);
if (response.ok) { // ÑкÑо HTTP-ÑÑаÑÑÑ Ñ Ð´ÑÐ°Ð¿Ð°Ð·Ð¾Ð½Ñ 200-299
// оÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑÑла запиÑÑ (див. пÑо Ñей меÑод нижÑе)
let json = await response.json();
} else {
alert("HTTP-Error: " + response.status);
}
Ðо дÑÑге, Ð´Ð»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑÑла запиÑÑ, поÑÑÑбно викоÑиÑÑовÑваÑи додаÑковий виклик меÑодÑ.
Response Ð½Ð°Ð´Ð°Ñ Ð´ÐµÐºÑлÑка меÑодÑв, ÑÐºÑ Ð¿Ð¾Ð²ÐµÑÑаÑÑÑ Ð¿ÑомÑÑ, Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ ÑÑла запиÑÑ Ð² ÑÑзниÑ
ÑоÑмаÑаÑ
:
response.text()â ÑиÑÐ°Ñ Ð²ÑдповÑÐ´Ñ Ñа повеÑÑаÑ, Ñк звиÑайний ÑекÑÑ,response.json()â декодÑÑ Ð²ÑдповÑÐ´Ñ Ñ ÑоÑмаÑÑ JSON,response.formData()â повеÑÑÐ°Ñ Ð²ÑдповÑдÑ, Ñк обâÑкÑFormData(вÑн бÑде ÑозглÑнÑÑий Ñ Ð½Ð°ÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑоздÑлÑ),response.blob()â повеÑÑÐ°Ñ Ð²ÑдповÑдÑ, Ñк Blob (бÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ Ð· Ñипом),response.arrayBuffer()â повеÑÑÐ°Ñ Ð²ÑдповÑдÑ, Ñк ArrayBuffer (низÑкоÑÑвневе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð²ÑÐ¹ÐºÐ¾Ð²Ð¸Ñ Ð´Ð°Ð½Ð¸Ñ ),- кÑÑм Ñого,
response.bodyÑе обâÑÐºÑ ReadableStream, за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ñкого можна оÑÑимÑваÑи (зÑиÑÑваÑи) ÑÑло вÑдповÑÐ´Ñ ÑаÑÑинами. Такий пÑиклад бÑде ÑозглÑнÑÑо ÑÑÐ¾Ñ Ð¸ пÑзнÑÑе.
ÐапÑиклад, бÑде оÑÑимано JSON-обâÑÐºÑ Ð· оÑÑаннÑми комÑÑами Ñз ÑепозиÑоÑÑÑ GitHub:
let url = 'https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits';
let response = await fetch(url);
let commits = await response.json(); // пÑоÑиÑаÑи ÑÑло вÑдповÑÐ´Ñ Ñк JSON
alert(commits[0].author.login);
Те Ñаме бÑде оÑÑимано без await, Ñз викоÑиÑÑаннÑм пÑомÑÑÑв:
fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
.then(response => response.json())
.then(commits => alert(commits[0].author.login));
ÐÐ»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð²ÑдповÑÐ´Ñ Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ÑекÑÑÑ, викоÑиÑÑано await response.text() замÑÑÑÑ .json():
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
let text = await response.text(); // пÑоÑиÑаÑи ÑÑло вÑдповÑÐ´Ñ Ñк ÑекÑÑ
alert(text.slice(0, 80) + '...');
ÐÐ»Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ ÑобоÑи Ñз бÑнаÑними даними, бÑде зÑоблено Ð·Ð°Ð¿Ð¸Ñ Ñа виведено на екÑан логоÑип ÑпеÑиÑÑкаÑÑÑ âfetchâ (див. ÑоздÑл Blob, Ñоб дÑзнаÑиÑÑ Ð´ÐµÑалÑнÑÑе пÑо опеÑаÑÑÑ Ñз Blob):
let response = await fetch('/article/fetch/logo-fetch.svg');
let blob = await response.blob(); // ÑкаÑаÑи, Ñк Blob об'ÑкÑ
// ÑÑвоÑÐµÐ½Ð½Ñ <img> Ð´Ð»Ñ Ð½Ñого
let img = document.createElement('img');
img.style = 'position:fixed;top:10px;left:10px;width:100px';
document.body.append(img);
// Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ð° екÑан
img.src = URL.createObjectURL(blob);
setTimeout(() => { // пÑиÑ
овÑÐ²Ð°Ð½Ð½Ñ ÑеÑез ÑÑи ÑекÑнди
img.remove();
URL.revokeObjectURL(img.src);
}, 3000);
Ðожна вибÑаÑи ÑÑлÑки один меÑод ÑиÑÐ°Ð½Ð½Ñ Ð²ÑдповÑдÑ.
ЯкÑо, бÑло оÑÑимано вÑдповÑд Ñз response.text(), ÑÐ¾Ð´Ñ response.json() не ÑпÑаÑÑÑ, бо Ð´Ð°Ð½Ñ Ð²Ð¶Ðµ бÑли обÑобленÑâ¦
let text = await response.text(); // ÑиÑаÑмо ÑÑло вÑдповÑдÑ
let parsed = await response.json(); // завеÑÑÑÑÑÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ, бо Ð´Ð°Ð½Ñ Ð²Ð¶Ðµ пÑоÑиÑанÑ
Ðаголовки вÑдповÑдÑ
Ðаоголовки вÑдповÑÐ´Ñ Ð·Ð±ÐµÑÑгаÑÑÑÑ Ñ ÑÑ
Ð¾Ð¶Ð¾Ð¼Ñ Ð½Ð° Map обâÑкÑÑ response.headers.
Це не зовÑÑм Map, але можна викоÑиÑÑовÑваÑи ÑÐ°ÐºÑ ÑÐ°Ð¼Ñ Ð¼ÐµÑоди, Ñоб оÑÑимаÑи заголовок за його Ð½Ð°Ð·Ð²Ð¾Ñ Ð°Ð±Ð¾ пеÑебÑаÑи заголовки Ñ ÑиклÑ:
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
// оÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ заголовкÑ
alert(response.headers.get('Content-Type')); // application/json; charset=utf-8
// пеÑебÑÑ ÑÑÑÑ
заголовкÑв
for (let [key, value] of response.headers) {
alert(`${key} = ${value}`);
}
Ðаголовки запиÑÑ
ÐÐ»Ñ Ð²ÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° запиÑÑ Ð² fetch можна викоÑиÑÑаÑи влаÑÑивÑÑÑÑ headers в обâÑкÑÑ options. Ðона мÑÑÑиÑÑ Ð¾Ð±âÑÐºÑ Ð· виÑ
Ñдними заголовками, напÑиклад:
let response = fetch(protectedUrl, {
headers: {
Authentication: 'secret'
}
});
â¦Ðле ÑÑнÑÑ ÑпиÑок забоÑÐ¾Ð½ÐµÐ½Ð¸Ñ HTTP заголовкÑв, ÑÐºÑ Ð½Ðµ можна вÑÑановиÑи:
Accept-Charset,Accept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodConnectionContent-LengthCookie,Cookie2DateDNTExpectHostKeep-AliveOriginRefererTETrailerTransfer-EncodingUpgradeViaProxy-*Sec-*
Ð¦Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ забезпеÑÑÑÑ Ð´Ð¾ÑÑовÑÑнÑÑÑÑ HTTP, ÑеÑез Ñе вони конÑÑолÑÑÑÑÑ Ñ Ð²ÑÑановлÑÑÑÑÑÑ Ð»Ð¸Ñе бÑаÑзеÑом.
POST запиÑи
ÐÐ»Ñ Ð²ÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ POST запиÑÑ Ð°Ð±Ð¾ запиÑÑ Ð· ÑнÑим меÑодом, ÑÑеба викоÑиÑÑаÑи fetch паÑамеÑÑи:
methodâ HTTP-меÑод, напÑикладPOST,bodyâ ÑÑло запиÑÑ, ÑоÑÑ Ð¾Ð´Ð½Ðµ Ñз ÑпиÑкÑ:- ÑÑдок (напÑиклад, Ñ ÑоÑмаÑÑ JSON),
- обâÑкÑ
FormData, Ð´Ð»Ñ Ð²ÑдпÑавки Ð´Ð°Ð½Ð¸Ñ Ñкmultipart/form-data, Blob/BufferSourceÐ´Ð»Ñ Ð²ÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÑнаÑÐ½Ð¸Ñ Ð´Ð°Ð½Ð¸Ñ ,- URLSearchParams, Ð´Ð»Ñ Ð²ÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ
Ñ ÐºÐ¾Ð´ÑваннÑ
x-www-form-urlencoded, викоÑиÑÑовÑÑÑÑÑÑ ÑÑдко.
ЧаÑÑÑÑе викоÑиÑÑовÑÑÑÑÑÑ JSON ÑоÑмаÑ.
ÐапÑиклад, Ñей код вÑдпÑавлÑÑ Ð¾Ð±âÑÐºÑ user Ñк JSON:
let user = {
name: 'John',
surname: 'Smith'
};
let response = await fetch('/article/fetch/post/user', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(user)
});
let result = await response.json();
alert(result.message);
ÐвеÑнÑÑÑ ÑвагÑ, ÑкÑо ÑÑло запиÑÑ body â ÑÑдок, Ñо заголовок Content-Type Ñипово бÑде text/plain;charset=UTF-8 .
Ðле, оÑкÑлÑки ми надÑилаÑмо Ð´Ð°Ð½Ñ Ñ ÑоÑмаÑÑ JSON, Ñо ÑеÑез headers ми маÑмо вÑÑановиÑи знаÑÐµÐ½Ð½Ñ application/json â пÑавилÑний Content-Type Ð´Ð»Ñ JSON ÑоÑмаÑÑ.
ÐÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð¾Ð±ÑаженнÑ
Ðожна вÑдпÑавиÑи бÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ fetch, викоÑиÑÑовÑÑÑи обâÑÐºÑ Blob або BufferSource.
У пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð½Ð¸Ð¶Ñе, Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ <canvas>, на коÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð° малÑваÑи ÑÑÑ
миÑки. ÐÑи наÑиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° ÐºÐ½Ð¾Ð¿ÐºÑ âÐÑдпÑавиÑиâ зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð±Ñде вÑдпÑавлено на ÑеÑвеÑ:
<body style="margin:0">
<canvas id="canvasElem" width="100" height="80" style="border:1px solid"></canvas>
<input type="button" value="ÐÑдпÑавиÑи" onclick="submit()">
<script>
canvasElem.onmousemove = function(e) {
let ctx = canvasElem.getContext('2d');
ctx.lineTo(e.clientX, e.clientY);
ctx.stroke();
};
async function submit() {
let blob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
let response = await fetch('/article/fetch/post/image', {
method: 'POST',
body: blob
});
// ÑеÑÐ²ÐµÑ Ð²ÑдповÑÐ´Ð°Ñ Ð¿ÑдÑвеÑдженнÑм Ñа ÑозмÑÑом зобÑаженнÑ
let result = await response.json();
alert(result.message);
}
</script>
</body>
ÐаÑваженнÑ, ÑÑÑ Ð½Ðµ поÑÑÑбно вÑÑÑÐ½Ñ Ð²ÑÑановлÑваÑи заголовок Content-Type, бо обâÑÐºÑ Blob вбÑдований Ñип (бÑде викоÑиÑÑано image/png, заданий ÑеÑез toBlob). ÐÑд ÑÐ°Ñ Ð²ÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв Blob, вÑн авÑомаÑиÑно ÑÑÐ°Ñ Ð·Ð½Ð°ÑеннÑм Content-Type.
ФÑнкÑÑÑ submit() може бÑÑи пеÑепиÑана без async/await, напÑиклад наÑÑÑпним Ñином:
function submit() {
canvasElem.toBlob(function(blob) {
fetch('/article/fetch/post/image', {
method: 'POST',
body: blob
})
.then(response => response.json())
.then(result => alert(JSON.stringify(result, null, 2)))
}, 'image/png');
}
ÐÑдÑÑмки
Типовий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ fetch ÑкладаÑÑÑÑÑ Ð· двоÑ
опеÑаÑоÑÑв await:
let response = await fetch(url, options); // завеÑÑÐµÐ½Ð½Ñ Ñз заголовками вÑдповÑдÑ
let result = await response.json(); // ÑиÑÐ°Ð½Ð½Ñ ÑÑла Ñ ÑоÑмаÑÑ json
Ðбо без await:
fetch(url, options)
.then(response => response.json())
.then(result => /* process result */)
ÐаÑамеÑÑи вÑдповÑдÑ:
response.statusâ HTTP-ÑÑаÑÑÑ Ð²ÑдповÑдÑ,response.okâtrue, ÑкÑо ÑÑаÑÑÑ Ð²ÑдповÑÐ´Ñ Ñ Ð´ÑÐ°Ð¿Ð°Ð·Ð¾Ð½Ñ 200-299.response.headersâ ÑÑ Ð¾Ð¶Ð¸Ð¹ наMapобâÑÐºÑ Ñз HTTP заголовками.
ÐеÑоди Ð´Ð»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑÑла вÑдповÑдÑ:
response.text()â повеÑÑÐ°Ñ Ð²ÑдповÑд, Ñк звиÑайний ÑекÑÑ,response.json()â декодÑÑ Ð²ÑдповÑÐ´Ñ Ñ ÑоÑмаÑÑ JSON,response.formData()â повеÑÑÐ°Ñ Ð²ÑдповÑÐ´Ñ Ñк обâÑкÑFormData(кодÑваннÑmultipart/form-data, див. Ñ Ð½Ð°ÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑоздÑлÑ),response.blob()â повеÑÑÐ°Ñ Ð¾Ð±âÑÐºÑ Ñк Blob (бÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ Ð· Ñипом),response.arrayBuffer()â повеÑÑÐ°Ñ Ð²ÑдповÑÐ´Ñ Ñк ArrayBuffer (низÑко ÑÑÐ²Ð½ÐµÐ²Ñ Ð±ÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ),
ÐпÑÑÑ fetch, ÑÐºÑ Ð¼Ð¸ ÑозглÑнÑли:
methodâ HTTP-меÑод,headersâ обâÑÐºÑ Ñз заголовками запиÑÑ (не вÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ дозволенÑ),bodyâ Ð´Ð°Ð½Ñ Ð´Ð»Ñ Ð²ÑдпÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ (ÑÑло запиÑÑ) Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ÑекÑÑÑstring,FormData,BufferSource,BlobабоUrlSearchParamsобâÑкÑ.
У наÑÑÑпниÑ
ÑоздÑлаÑ
бÑде ÑозглÑнÑÑо бÑлÑÑе паÑамеÑÑÑв Ñа ваÑÑанÑÑв викоÑиÑÑÐ°Ð½Ð½Ñ fetch.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)