在jQuery.ajax请求中使用齐磊功能

时间:2019-01-10 05:17:12

标签: javascript jquery ajax

我有AJAX响应,其中所有key,value对都被引用了。我想从任何数字值中删除引号。对于所有AJAX请求,我都需要以最小的努力在全球范围内完成。

我对大多数请求都使用jQuery.getJSON,并且我想要一个不需要单独调整每个当前AJAX请求的解决方案。 (我不想在每个现有的JSON.parse(text,myreviver)通话中添加一个$.getJSON通话。)

例如:

Received:    {"age":"31", "money": "-1.329"}
Want:        {"age": 31, "money": -1.329}

对于所有AJAX请求,我该怎么做?

我当前的最终目标是使用JSON.parse(text, reviver)处理数据(感谢this question)。不过,我不知道如何将其连接到jQuery.ajax中。

我尝试使用ajaxSuccess(),但似乎没有链式处理任何数据。例如:

$(document.ajaxSuccess) ( function(j) {
    JSON.parse(j, myReviver);
}

.getJSON(url, data, function(j) {
    // The data in this success function has not been through myReviver.
}

我如何:

  • jQuery.getJSON中使用齐磊功能,或者
  • 在全局success函数之前处理AJAX响应,然后再到达其他成功函数?

2 个答案:

答案 0 :(得分:1)

您可以使用自己的方法覆盖.getJSON

原生getJSON方法可以在这里看到:

https://j11y.io/jquery/#v=git&fn=jQuery.getJSON

function (url, data, callback) {
  return jQuery.get(url, data, callback, "json");
}

这很简单,只需将传递给getJSON的回调,使用jQuery.get而不是'text' own 回调传递给'json' ,使用自定义的reviver解析JSON,然后调用原始回调。

一个复杂的问题是,传递给getJSON的第二个参数是可选的(随请求一起发送的数据)。

假设您始终使用成功函数(第三个参数和最后一个参数),则可以使用rest参数和pop()来获取传递的成功函数。创建一个使用文本响应并使用自定义JSON.parse的自定义成功函数,然后使用创建的对象调用传递的成功函数。

const dequoteDigits = json => JSON.parse(
  json,
  (key, val) => (
    typeof val === 'string' && /^[+-]?[0-9]+(?:\.[0-9]+)$/.test(val)
    ? Number(val)
    : val
  )
);
jQuery.getJSON = function (url, ...rest) {
  // normal parameters: url, data (optional), success
  const success = rest.pop();
  const customSuccess = function(textResponse, status, jqXHR) {
    const obj = dequoteDigits(textResponse);
    success.call(this, obj, status, jqXHR);
  };
  // spread the possibly-empty empty array "rest" to put "data" into argument list
  return jQuery.get(url, ...rest, customSuccess, 'text');
};

jQuery.getJSON('https://jsonplaceholder.typicode.com/users', (obj) => {
  console.log(obj);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

上面的代码段输出与所请求的URL的区别

https://jsonplaceholder.typicode.com/users

是经度和纬度属性值已转换为数字,而不是其余字符串。

如果您也使用await而没有成功回调,那么您将需要覆盖返回的Promise的then属性,尽管处理可选的成功回调会使代码的逻辑成为可能更加丑陋:

const dequoteDigits = json => JSON.parse(
  json,
  (key, val) => (
    typeof val === 'string' && /^[+-]?[0-9]+(?:\.[0-9]+)$/.test(val)
    ? Number(val)
    : val
  )
);
jQuery.getJSON = function (url, ...rest) {
  // normal parameters: url, data (optional), success (optional)
  const data = rest.length && typeof rest[0] !== 'function'
  ? [rest.shift()]
  : [];
  
  const newSuccessArr = typeof rest[0] === 'function'
  ? [function(textResponse, status, jqXHR) {
        const obj = dequoteDigits(textResponse);
        rest[0].call(this, obj, status, jqXHR);
      }
    ]
  : [];
  // spread the possibly-empty dataObj and newSuccessObj into the new argument list array
  const newArgs = [url, ...data, ...newSuccessArr, 'text'];
  
  const prom = jQuery.get.apply(this, newArgs);
  const nativeThen = prom.then;
  prom.then = function(resolve) {
    nativeThen.call(this)
      .then((res) => {
        const obj = dequoteDigits(this.responseText);
        resolve(obj);
      });
  };
  return prom;
};


jQuery.getJSON('https://jsonplaceholder.typicode.com/users', (obj) => {
  console.log(obj[0].address.geo);
});



(async () => {
  const obj = await jQuery.getJSON('https://jsonplaceholder.typicode.com/users');
  console.log(obj[0].address.geo);
  // console.log(obj);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

答案 1 :(得分:0)

您可以使用ajaxSetup“为所有AJAX请求在全局范围内以最小的努力覆盖默认文本到json转换器。”

Areas
Cells(DestRow, "J")