Skip to content

Instantly share code, notes, and snippets.

@ysmood
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ysmood/80ff64eb862d498400f0 to your computer and use it in GitHub Desktop.
Save ysmood/80ff64eb862d498400f0 to your computer and use it in GitHub Desktop.
function (opts, data, method, headers) {
if (_.isString(opts))
opts = { url: opts };
opts = _.defaults(opts, {
method: method || 'GET',
data: data || null,
header: headers || {},
statusFilter: function (status) {
return status < 300;
}
});
var req = new XMLHttpRequest();
var promise = new Promise(function (resolve, reject) {
req.addEventListener('readystatechange', function () {
if (req.readyState === 4) {
if (req.status === 0)
return reject(new Error('request abort by browser'));
if (opts.statusFilter(req.status)) {
reject(req);
} else {
req.json = function () { JSON.parse(req.responseText) };
resolve(req);
}
}
});
req.open(opts.method, opts.url);
_.map(
opts.headers,
_.rearg(req.setRequestHeader.bind(req), [1, 0])
);
req.send(opts.data);
})
promise.req = req;
return promise;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment