req-promise.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. (function($) {
  2. if(! $) {
  3. throw new Error('neither jQuery nor Zepto is loaded');
  4. }
  5. function getAsync(url, dataType) {
  6. return new Promise(function(resolve, reject) {
  7. $.ajax({
  8. type: 'GET',
  9. url: url,
  10. success: function(data) {
  11. resolve(data);
  12. },
  13. error: function(jqXHR) {
  14. reject(new Error(jqXHR.responseText));
  15. }
  16. }, dataType);
  17. });
  18. }
  19. function sendAsync(url, data, options) {
  20. if(['POST', 'PUT', 'PATCH'].indexOf(options.type) === -1) {
  21. throw new Error('sendAsync must be called with options.type set to POST or PUT');
  22. }
  23. if(typeof data === 'object') {
  24. data = JSON.stringify(data);
  25. }
  26. return new Promise(function(resolve, reject) {
  27. options = _.extend(options, {
  28. url: url,
  29. data: data,
  30. contentType: 'application/json',
  31. dataType: 'json',
  32. success: function(data) {
  33. resolve(data);
  34. },
  35. error: function(jqXHR, textStatus, errorThrown) {
  36. console.log('this should throw a bloody error', jqXHR.responseText);
  37. reject(new Error(errorThrown));
  38. }
  39. });
  40. $.ajax(options);
  41. });
  42. }
  43. function postAsync(url, data, options) {
  44. return sendAsync(url, data, _.extend(options, { type: 'POST' }));
  45. }
  46. function putAsync(url, data, options) {
  47. return sendAsync(url, data, _.extend(options, { type: 'PUT' }));
  48. }
  49. window.rp = {
  50. get: getAsync,
  51. post: postAsync,
  52. put: putAsync
  53. };
  54. })(jQuery || Zepto);