首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端jsonp配置功能实现

前端jsonp配置功能实现

原创
作者头像
小焱
发布2025-07-09 11:35:44
发布2025-07-09 11:35:44
11800
代码可运行
举报
文章被收录于专栏:前端开发前端开发
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制
function jsonp(url, options = {}) {
  return new Promise((resolve, reject) => {
    // 生成唯一回调函数名
    const callbackName = `jsonp_callback_${Date.now()}_${Math.random().toString().replace('.', '')}`;
    // 处理URL参数
    const params = new URLSearchParams(options.params || {});
    params.append(options.callbackParam || 'callback', callbackName);
    
    // 创建script标签
    const script = document.createElement('script');
    script.src = `${url}?${params}`;
    
    // 挂载回调函数到window
    window[callbackName] = (data) => {
      try {
        resolve(data);
      } finally {
        // 清理
        cleanup();
      }
    };
    
    // 错误处理
    script.onerror = (error) => {
      reject(new Error(`JSONP请求失败: ${error.message}`));
      cleanup();
    };
    
    // 超时处理
    if (options.timeout) {
      const timeoutId = setTimeout(() => {
        reject(new Error('JSONP请求超时'));
        cleanup();
      }, options.timeout);
      
      script.onload = () => clearTimeout(timeoutId);
    }
    
    // 清理函数
    function cleanup() {
      // 移除script标签
      script.remove();
      // 删除全局回调函数
      delete window[callbackName];
    }
    
    // 添加到文档中触发请求
    document.head.appendChild(script);
  });
}

// 使用示例
jsonp('https://api.example.com/data', {
  params: {
    key: 'value',
    format: 'json'
  },
  callbackParam: 'jsonpCallback',
  timeout: 5000
})
.then(data => console.log('JSONP响应:', data))
.catch(error => console.error('JSONP错误:', error));    

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档