-
Notifications
You must be signed in to change notification settings - Fork 0
Cookbook: main
Eugene Lazutkin edited this page Feb 28, 2020
·
17 revisions
The main functionality of heya-io
is in file io.js
, which should be included. As a general entry point it uses main.js
, which includes the main API, and includes and enables track, cache, and bundle services.
See How to include for more details. See main for the full documentation.
io.get('/url').then(function (value) {
console.log('got:', value);
});
io.get('/url', {a: 1, b: 'x'}).then(function (value) {
// GET /url?a=1&b=x
console.log('got:', value);
});
Let's POST a form (may include files, or any other form elements):
var formElement = document.querySelector('form');
io.post('/form', new FormData(formElement));
io.get({
url: '/url',
headers: {'Accept': 'application/xml', 'X-Token': 123}
}).then(function (value) {
console.log('got:', value);
});
function done() { console.log('done'); }
io.post('/things', {name: 'Bob', age: 42}).then(done);
io.put('/things/5', {name: 'Alice', age: 33}).then(done);
io.patch('/things/7', {age: 14}).then(done);
io.remove('/things/3').then(done);
io.head('/url', {q: 1}).then(function () {
console.log('present');
}).catch(function () {
console.log('missing');
});
io.get('/url').then(function (value) {
// do something with value
}).catch(function (value) {
if (value instanceof io.BadStatus) {
console.log('Bad server status:', value.xhr.status);
} else if (value instance io.TimedOut) {
console.log('I/O has timed out');
} else if (value instance io.FailedIO) {
console.log('Cannot initiate an I/O request');
} else {
console.log('Error:', value);
}
});
io.get({
url: '/url',
returnXHR: true
}).then(function (xhr) {
console.log('Content-Type:', xhr.getResponseHeader('Content-Type'));
});
io.get({
url: '/url',
returnXHR: true
}).then(function (xhr) {
console.log('Status:', xhr.status, ' ', xhr.statusText);
if (xhr.responseType === 'json') {
console.log('JSON payload:', xhr.response);
} else if (/^application\/json\b/.test(xhr.getResponseHeader('Content-Type'))) {
console.log('JSON payload:', JSON.parse(xhr.responseText));
}
});
io.get('/url', {q: 1}).then(function (value) {
return io.get('/url', {q: value.id});
}).then(function (value) {
return io.get('/url', {q: value.id});
}).then(function (value) {
console.log('Final result:', value);
}).catch(function (value) {
console.log('Error while executing:'. value.options);
});
Using Promise.all()
:
Promise.all([
io.get('/url', {q: 1}),
io.get('/url', {q: 2})
]).then(values => {
values.forEach((value, index) => console.log('Request #' + index ':', value));
}).catch(error => console.log('Some request has failed: ', error));
Using heya-async:
async.par(
[io.get('/url', {q: 1}), io.get('/url', {q: 2})],
io.Deferred // we will use the same deferred
).then(function (values) {
values.forEach(function (value, index) {
if (value instance io.FailedIO) {
console.log('Request #' + index + ' has failed.');
} else {
console.log('Request #' + index ':', value);
}
});
});
Use pseudo-hosts in a program, but keep actual URLs in settings:
const redirects = {
$widgets: 'https://widgets.example.com/api/2',
$gadgets: 'https://gadgets.example.com/api/1'
};
const redirectSources = Object.keys(redirects);
const prevProcessOptions = io.processOptions;
io.processOptions = options => {
options = prevProcessOptions(options);
for (let i = 0; i < redirectSources.length; ++i) {
const redirect = redirectSources[i];
if (redirect.length && options.url.substr(0, redirect.length) === redirect &&
options.url.charAt(redirect.length) === '/') {
const newOptions = Object.create(options);
newOptions.url = redirects[redirect] + newOptions.url.substr(redirect.length);
return newOptions;
}
}
return options;
};
How to use it:
// GET https://widgets.example.com/api/2/123
const data = await io.get('$widgets/123');
Use a URL outside of heya:
const getUrl = options => {
if (typeof options == 'string') options = {url: options};
return io.buildUrl(io.processOptions(options));
};
How to use it:
const url = getUrl({url: '$widgets/-list', query: {a: 1}});
// https://widgets.example.com/api/2/-list?a=1
const a = document.getElementById('myAnchor');
a.href = url;
// <a id="myAnchor" href="https://widgets.example.com/api/2/-list?a=1">link</a>