Skip to content

Instantly share code, notes, and snippets.

@Naddiseo
Created September 17, 2014 23:18
Show Gist options
  • Save Naddiseo/df6eac60da6bec4056c5 to your computer and use it in GitHub Desktop.
Save Naddiseo/df6eac60da6bec4056c5 to your computer and use it in GitHub Desktop.
m.request = function(xhrOptions) {
var deferred = m.deferred()
var serialize = xhrOptions.serialize = xhrOptions.serialize || JSON.stringify
var deserialize = xhrOptions.deserialize = xhrOptions.deserialize || JSON.parse
var extract = xhrOptions.extract || function(xhr) {
return xhr.responseText.length === 0 && deserialize === JSON.parse ? null : xhr.responseText
}
xhrOptions.onload = xhrOptions.onerror = function(e) {
e = e || event
var unwrap = (e.type == "load" ? xhrOptions.unwrapSuccess : xhrOptions.unwrapError) || identity
try {
var response = unwrap(deserialize(extract(e.target, xhrOptions)))
if (e.type == "load") {
if (type.call(response) == "[object Array]" && xhrOptions.type) {
for (var i = 0; i < response.length; i++) response[i] = new xhrOptions.type(response[i])
}
else if (xhrOptions.type) response = new xhrOptions.type(response)
deferred.resolve(response);
}
else deferred.reject(response);
}
catch (e) {
// Any exception in the onerror/onload is not part of the promise, so it should still throw to the caller
if (e instanceof SyntaxError) throw new SyntaxError("Could not parse HTTP response. See http://lhorie.github.io/mithril/mithril.request.html#using-variable-data-formats")
else throw e
}
finally {
// I'm assuming you always want there to be an endcomputation so I'm sticking in this finally.
if (xhrOptions.background !== true) m.endComputation()
}
}
// Put a try/catch around anything that can potentially throw on function execution.
try {
if (xhrOptions.background !== true) m.startComputation()
xhrOptions.url = parameterizeUrl(xhrOptions.url, xhrOptions.data)
xhrOptions = bindData(xhrOptions, xhrOptions.data, serialize)
ajax(xhrOptions)
}
catch (e) {
// An exception in the promise's body should call the first rejection handler
deferred.reject(e);
}
return deferred.promise
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment