Skip to content

Instantly share code, notes, and snippets.

@digitalhitler
Created May 8, 2017 10:45
Show Gist options
  • Save digitalhitler/35f2f79b7bc100db0c9a807ebcf22807 to your computer and use it in GitHub Desktop.
Save digitalhitler/35f2f79b7bc100db0c9a807ebcf22807 to your computer and use it in GitHub Desktop.
JS Fetch & XHR Tools
//
export function toArray(arr = []) {
return Array.prototype.slice.call(arr, 0);
}
//
export function mergeOptions(obj1, obj2) {
var merged = {};
for (var attrname in obj1) { merged[attrname] = obj1[attrname]; }
for (var attrname in obj2) { merged[attrname] = obj2[attrname]; }
return merged;
}
//
export function initNumbersFormat() {
Number.prototype.format = function(decimals) {
decimals = ((decimals !== undefined) ? decimals : 0);
var
result,
parts = String(this.toFixed(decimals)).split('.'),
integer = parts[0],
fraction = parts[1],
slice, slices = [];
if (integer > 9999) {
while (slice = integer.slice(-3)) {
slices.push(slice);
integer = integer.substr(0, integer.length - 3);
}
result = slices.reverse().join(' ');
}
else {
result = integer;
}
if (fraction)
result += '.' + fraction;
return result;
}
}
//
function eventToXHR(event) {
return event.target;
}
//
export function parseResult(result) {
return JSON.parse(result.responseText);
}
//
export function logError(error) {
console.warn(error);
}
//
export function fetchJSONP(url) {
return new Promise((resolve, reject) => {
$.ajax({
url,
dataType: 'jsonp',
success: data => resolve(data),
fail: error => reject(error),
});
});
}
//
export function fetch(url, withCredentials, progressHandler) {
const request = new XMLHttpRequest();
const stream = new Promise((resolve, reject) => {
request.addEventListener('load', resolve);
request.addEventListener('error', reject);
request.addEventListener('abort', reject);
request.addEventListener('timeout', reject);
if (typeof(progressHandler) === 'function') {
request.addEventListener('progress', event => {
if (event.lengthComputable) {
progressHandler(event.loaded / event.total);
}
});
}
request.open('GET', url);
request.withCredentials = Boolean(withCredentials);
request.send();
})
.then(eventToXHR, eventToXHR)
.then(xhr => {
const status = xhr.status;
if (status >= 200 && status < 300 || status === 304) {
return xhr;
}
return Promise.reject(xhr);
});
stream.abort = () => request.abort();
return stream;
}
//TODO: one more function for collection
export function isArticle() {
return 'article' in window;
}
//
export function isFeature() {
return document.querySelectorAll('.js-feature').length > 0;
}
//
export function hexToRgb(hex) {
hex = hex.replace('#', '');
let r = parseInt(hex.substring(0, 2), 16);
let g = parseInt(hex.substring(2, 4), 16);
let b = parseInt(hex.substring(4, 6), 16);
return [r, g, b];
}
export function loadYoutubeAPI() {
let script = document.createElement('script');
script.src = 'https://www.youtube.com/player_api';
document.querySelector('head').appendChild(script);
}
export function clearNumber(str) {
return str.replace(/[^\d\.]/g, '');
}
export function getScrollPosition() {
return window.pageYOffset || document.documentElement.scrollTop;
}
/** WEBPACK FOOTER **
** ./app/scripts/client/utils.js
**/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment