request.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. var constants = require('./constants');
  2. var utils = require('./utils');
  3. var Session = require('./session');
  4. var loginLib = require('./login');
  5. var noop = function noop() {};
  6. var buildAuthHeader = function buildAuthHeader(session) {
  7. var header = {};
  8. if (session) {
  9. header[constants.WX_HEADER_SKEY] = session;
  10. }
  11. return header;
  12. };
  13. /***
  14. * @class
  15. * 表示请求过程中发生的异常
  16. */
  17. var RequestError = (function () {
  18. function RequestError(type, message) {
  19. Error.call(this, message);
  20. this.type = type;
  21. this.message = message;
  22. }
  23. RequestError.prototype = new Error();
  24. RequestError.prototype.constructor = RequestError;
  25. return RequestError;
  26. })();
  27. function request(options) {
  28. if (typeof options !== 'object') {
  29. var message = '请求传参应为 object 类型,但实际传了 ' + (typeof options) + ' 类型';
  30. throw new RequestError(constants.ERR_INVALID_PARAMS, message);
  31. }
  32. var requireLogin = options.login;
  33. var success = options.success || noop;
  34. var fail = options.fail || noop;
  35. var complete = options.complete || noop;
  36. var originHeader = options.header || {};
  37. // 成功回调
  38. var callSuccess = function () {
  39. success.apply(null, arguments);
  40. complete.apply(null, arguments);
  41. };
  42. // 失败回调
  43. var callFail = function (error) {
  44. fail.call(null, error);
  45. complete.call(null, error);
  46. };
  47. // 是否已经进行过重试
  48. var hasRetried = false;
  49. if (requireLogin) {
  50. doRequestWithLogin();
  51. } else {
  52. doRequest();
  53. }
  54. // 登录后再请求
  55. function doRequestWithLogin() {
  56. loginLib.login({ success: doRequest, fail: callFail });
  57. }
  58. // 实际进行请求的方法
  59. function doRequest() {
  60. var authHeader = buildAuthHeader(Session.get());
  61. wx.request(utils.extend({}, options, {
  62. header: utils.extend({}, originHeader, authHeader),
  63. success: function (response) {
  64. var data = response.data;
  65. var error, message;
  66. if (data && data.code === -1) {
  67. Session.clear();
  68. // 如果是登录态无效,并且还没重试过,会尝试登录后刷新凭据重新请求
  69. if (!hasRetried) {
  70. hasRetried = true;
  71. doRequestWithLogin();
  72. return;
  73. }
  74. message = '登录态已过期';
  75. error = new RequestError(data.error, message);
  76. callFail(error);
  77. return;
  78. } else {
  79. callSuccess.apply(null, arguments);
  80. }
  81. },
  82. fail: callFail,
  83. complete: noop,
  84. }));
  85. };
  86. };
  87. module.exports = {
  88. RequestError: RequestError,
  89. request: request,
  90. };