In my case I had a simple connection issue, but because it attempted to parse that result I coudln't see the error.
else {
try { res = JSON.parse(xhr.responseText); } catch (e) { onError(e); }
if (res) onError(res);
}
should become:
else {
onError(xhr); // let t he user figure it out
}