54 lines
1.3 KiB
JavaScript
54 lines
1.3 KiB
JavaScript
/**
|
|
* JSONP client (Browser).
|
|
*/
|
|
|
|
import Promise from '../../promise';
|
|
|
|
export default function (request) {
|
|
return new Promise(resolve => {
|
|
|
|
var name = request.jsonp || 'callback', callback = request.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2), body = null, handler, script;
|
|
|
|
handler = ({type}) => {
|
|
|
|
var status = 0;
|
|
|
|
if (type === 'load' && body !== null) {
|
|
status = 200;
|
|
} else if (type === 'error') {
|
|
status = 500;
|
|
}
|
|
|
|
if (status && window[callback]) {
|
|
delete window[callback];
|
|
document.body.removeChild(script);
|
|
}
|
|
|
|
resolve(request.respondWith(body, {status}));
|
|
};
|
|
|
|
window[callback] = result => {
|
|
body = JSON.stringify(result);
|
|
};
|
|
|
|
request.abort = () => {
|
|
handler({type: 'abort'});
|
|
};
|
|
|
|
request.params[name] = callback;
|
|
|
|
if (request.timeout) {
|
|
setTimeout(request.abort, request.timeout);
|
|
}
|
|
|
|
script = document.createElement('script');
|
|
script.src = request.getUrl();
|
|
script.type = 'text/javascript';
|
|
script.async = true;
|
|
script.onload = handler;
|
|
script.onerror = handler;
|
|
|
|
document.body.appendChild(script);
|
|
});
|
|
}
|