返回

深入浅出解析 JSONP 超时处理——从 Sentry 报错中汲取经验

前端

前言

在前端开发中,跨域数据获取是一个常见且棘手的问题。JSONP(JSON with Padding)是一种简单而有效的跨域数据获取技术,它利用 <script> 标签的跨域特性,将数据以函数调用的形式返回,从而绕过浏览器的同源策略限制。

JSONP 的工作原理

JSONP 的工作原理很简单,它通过在 <head> 标签中动态插入 <script> 标签,向指定 URL 发起请求。服务器接收到请求后,会将数据包装成一个函数调用的形式,并通过 <script> 标签返回给客户端。客户端浏览器执行 <script> 标签中的代码,从而获取到数据。

例如,假设我们有一个名为 getData() 的函数,用于从服务器获取数据,服务器返回的数据是一个名为 result 的 JSON 对象。我们可以使用 JSONP 技术来实现跨域获取数据,具体步骤如下:

  1. <head> 标签中动态插入 <script> 标签,其中 src 属性指向服务器的 URL,callback 属性指定一个函数名,用于接收服务器返回的数据。
<script src="https://example.com/api/getData?callback=getData" type="text/javascript"></script>
  1. 服务器接收到请求后,会将 result 数据包装成一个函数调用的形式,并通过 <script> 标签返回给客户端。
getData({"result": {"name": "John Doe", "age": 30}});
  1. 客户端浏览器执行 <script> 标签中的代码,从而获取到数据。
function getData(data) {
  console.log(data.result.name); // "John Doe"
  console.log(data.result.age); // 30
}

JSONP 的超时处理

在实际应用中,JSONP 请求可能会遇到超时的情况。超时是指在指定的时间内没有收到服务器的响应。当 JSONP 请求超时时,客户端浏览器会执行以下操作:

  1. 停止等待服务器的响应。
  2. 调用 callback 函数,并传入一个错误对象。

例如,我们可以通过以下代码来处理 JSONP 超时:

function getData(data, error) {
  if (error) {
    console.error("JSONP request timed out.");
  } else {
    console.log(data.result.name); // "John Doe"
    console.log(data.result.age); // 30
  }
}

Sentry 报错案例

最近在 Sentry 上看到某个项目偶尔会有零星的 xxx is not a function 的错误上报,仔细查看发现,报错的是诸如 JSONP_1628781407874 这样的方法名触发的。

通过分析发现,该项目使用了 JSONP 技术来获取跨域数据,但没有对 JSONP 请求进行超时处理。当 JSONP 请求超时时,客户端浏览器会调用 JSONP_1628781407874 函数,但该函数并没有被定义,因此引发了错误。

结语

通过对 JSONP 超时处理的深入剖析,我们可以更好地理解和掌握 JSONP 技术,解决跨域数据获取问题。在实际应用中,我们应该始终对 JSONP 请求进行超时处理,以避免出现错误。