req-promise.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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) {
  36. reject(new Error(jqXHR.responseText));
  37. }
  38. });
  39. $.ajax(options);
  40. });
  41. }
  42. function postAsync(url, data, options) {
  43. return sendAsync(url, data, _.extend(options, { type: 'POST' }));
  44. }
  45. function putAsync(url, data, options) {
  46. return sendAsync(url, data, _.extend(options, { type: 'PUT' }));
  47. }
  48. window.rp = {
  49. get: getAsync,
  50. post: postAsync,
  51. put: putAsync
  52. };
  53. })(jQuery || Zepto);