资讯专栏INFORMATION COLUMN

jquery ajax 方法封装及 api 文件设计

leone / 2869人阅读

摘要:封装文件封装例如命令数据用来记录每次请求的唯一标识唯一标识生成方法模块主体获取失败比对请求保证返回结果的正确性重复请求有可能会带来返回结果不可靠的问题的默认设置服务器已经错误将大于的数字位以上包裹双引号避免溢出这里是根据后台

封装 jquery ajax 文件
/**
 * 封装 jquery ajax 
 * 例如:
 * ajaxRequest.ajax.triggerService(
 *   "apiCommand", [命令数据] )
 *   .then(successCallback, failureCallback);
 * );
 */
var JSON2 = require("LibsDir/json2");
var URL = "../AjaxHandler.aspx?r=";

// 用来记录每次请求的唯一标识
var requestIdentifier = {};

// 唯一标识生成方法
function generateGUID() {
  var d = new Date().getTime();
  if (typeof performance !== "undefined" && typeof performance.now === "function") {
    d += performance.now();
  }
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
    var r = (d + Math.random() * 16) % 16 | 0;
    d = Math.floor(d / 16);
    return (c === "x" ? r : (r & 0x3 | 0x8)).toString(16);
  });
}

// 模块主体
var ajaxRequest = ajaxRequest || {};
(function ($) {
  if (!$) {
    throw "jquery获取失败!";
  }

  ajaxRequest.json = JSON2;
  ajaxRequest.ajax = function (userOptions, serviceName, requestId) {
    userOptions = userOptions || {};
    var options = $.extend({}, ajaxRequest.ajax.defaultOpts, userOptions);
    options.success = undefined;
    options.error = undefined;
    return $.Deferred(function ($dfd) {
      $.ajax(options)
        .done(function (result, textStatus, jqXHR) {
          if (requestId === requestIdentifier[serviceName]) {
            // 比对请求id, 保证返回结果的正确性 (重复请求有可能会带来返回结果不可靠的问题)
            ajaxRequest.ajax.handleResponse(result, $dfd, jqXHR, userOptions, serviceName, requestId);
          }
        })
        .fail(function (jqXHR, textStatus, errorThrown) {
          if (requestId === requestIdentifier[serviceName]) {
            // jqXHR.status
            $dfd.reject.apply(this, arguments);
            userOptions.error.apply(this, arguments);
          }
        });
    });
  };

  $.extend(ajaxRequest.ajax, {
    // $.ajax() 的默认设置
    defaultOpts: {
      // url: "../AjaxSecureHandler.aspx,
      dataType: "json",
      type: "POST",
      contentType: "application/x-www-form-urlencoded; charset=UTF-8"
    },

    handleResponse: function (result, $dfd, jqXHR, userOptions, serviceName, requestId) {
      if (!result) {
        $dfd && $dfd.reject(jqXHR, "error response format!");
        userOptions.error(jqXHR, "error response format!");
        return;
      }

      // 服务器已经错误
      if (result.ErrorCode != "200") {
        $dfd && $dfd.reject(jqXHR, result.ErrorMessage);
        userOptions.error(jqXHR, result);
        return;
      }

      if (result.Data) {
        // 将大于2^53的数字(16位以上)包裹双引号, 避免溢出
        var jsonStr = result.Data.replace(/(:s*)(d{16,})(s*,|s*})/g, "$1"$2"$3");
        var resultData = ajaxRequest.json.parse(jsonStr);
        $dfd.resolve(resultData);
        userOptions.success && userOptions.success(resultData);
      } else {
        $dfd.resolve();
        userOptions.success && userOptions.success();
      }
    },

    buildServiceRequest: function (serviceName, input, userSuccess, userError, ajaxParams) {
      // 这里是根据后台要求构建的
      var requestData = {
        MethodAlias: serviceName, // 方法名
        Parameter: input // 传递的参数
      };

      var request = $.extend({}, ajaxParams, {
        // 这里要对传递的 JSON 字符串参数数据使用 escape 方法进行编码
        // "data=" 是根据项目约定增加的,与 contentType 相对应
        data: "data=" + escape(ajaxRequest.json.stringify(requestData)),
        success: userSuccess,
        error: function (jqXHR, textStatus, errorThrown) {
          // 这里是在请求出错的时候做一个统一处理, 输出方法名和错误对象
          console.log(serviceName, jqXHR);
          if (userError && (typeof userError === "function")) {
            userError(jqXHR, textStatus, errorThrown);
          }
        }
      });

      return request;
    },

    // 构建参数对象, 生成唯一标识, 触发请求
    triggerService: function (serviceName, input, success, error, ajaxParams) {
      var request = ajaxRequest.ajax.buildServiceRequest(serviceName, input, success, error, ajaxParams);
      // 生成此次 ajax 请求唯一标识
      var requestId = requestIdentifier[serviceName] = generateGUID();
      request.url = URL + requestId;
      return ajaxRequest.ajax(request, serviceName, requestId);
    }
  });

})(jQuery);

module.exports = ajaxRequest;
api 文件示例
/**
 * api 接口定义
 * 这个示例中假设后台服务要求接受数组形式的参数
 */
var ajaxRequest = require("../common/ajax-request"); // ajax 封装
var JSON2 = require("LibsDir/json2");

// 请求数据方法
var apiService = (function () {
  var request = {};
  // 产品列表 (参数需要进一步处理的情况)
  request.getProductListData = function (conditionObj) {
    return ajaxRequest.ajax.triggerService("SearchProductList", [JSON2.stringify(conditionObj)]);
  };

  // 搜索热词 (参数为空的情况)
  request.getHotWords = function () {
    return ajaxRequest.ajax.triggerService("GetSearchHotKeys", []);
  };

  // 获取用户配置
  request.getUserConfig = function () {
    return ajaxRequest.ajax.triggerService("GetUserConfig", []);
  };

  // 设置用户配置
  request.setUserConfig = function (params) {
    return ajaxRequest.ajax.triggerService("SetUserConfig", [params]);
  };

  return request;
})();

module.exports = apiService;
业务代码中调用 api 接口
// 综合搜索热词查询
apiService.getHotWords()
  .then(function (result) {
    if (result.length > 0) {
      // 成功回调
      // handleResult(result);
    }
  })
  .fail(function (err) {
    console.log("GetSearchHotKeys: ", err);
    // 失败回调
    handleResult();
  });

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103026.html

相关文章

  • jquery ajax 方法封装说明

    摘要:简要说明前面我写了一篇方法封装及文件设计文档,主要用来说明我们在项目中通常会对的方法进行进一步的封装处理,便于我们在业务代码中使用。这篇文档我们主要对封装的方法进行一个简要说明。 简要说明 前面我写了一篇《jquery ajax 方法封装及 api 文件设计》文档,主要用来说明我们在项目中通常会对 jquery 的 ajax 方法进行进一步的封装处理,便于我们在业务代码中使用。从那篇文...

    z2xy 评论0 收藏0
  • 学Java编程需要注意的地方

    摘要:学编程真的不是一件容易的事不管你多喜欢或是多会编程,在学习和解决问题上总会碰到障碍。熟练掌握核心内容,特别是和多线程初步具备面向对象设计和编程的能力掌握基本的优化策略。   学Java编程真的不是一件容易的事,不管你多喜欢或是多会Java编程,在学习和解决问题上总会碰到障碍。工作的时间越久就越能明白这个道理。不过这倒是一个让人进步的机会,因为你要一直不断的学习才能很好的解决你面前的难题...

    leanxi 评论0 收藏0
  • Ajax在vue中的封装使用

    摘要:今天给大家写一篇关于在中的应用及封装,有些同学可能会有疑问,因为熟悉的都知道,中有和是专门用于交互的,那么岂不是多此一举吗其实不然,有的优势,并且小编本身对有着特殊的感情,今天就给大家详细详解在中的应用。 今天给大家写一篇关于ajax在vue中的应用及封装,有些同学可能会有疑问,因为熟悉vue的都知道,vue中有vue-resource和axios是专门用于http交互的,那么ajax...

    godruoyi 评论0 收藏0
  • Ajax在vue中的封装使用

    摘要:今天给大家写一篇关于在中的应用及封装,有些同学可能会有疑问,因为熟悉的都知道,中有和是专门用于交互的,那么岂不是多此一举吗其实不然,有的优势,并且小编本身对有着特殊的感情,今天就给大家详细详解在中的应用。 今天给大家写一篇关于ajax在vue中的应用及封装,有些同学可能会有疑问,因为熟悉vue的都知道,vue中有vue-resource和axios是专门用于http交互的,那么ajax...

    pingink 评论0 收藏0

发表评论

0条评论

leone

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<