fetch-jsonp源码阅读

fetchJsonp源码

源码地址:https://github.com/camsong/fetch-jsonp

jsonp优势

  • 请求数据没有跨域的限制,后台不用考虑跨域问题

  • 对于老版本浏览器更加支持

jsonp缺陷

  • 只支持get请求,不支持其他所有方式的请求(请求方式受到了限制)
  • 只支持get请求,不支持post(不安全因素一)
  • 因为没有跨域,所以调用接口方不能限制ip,安全方面不是很到位(不安全因素二)

使用例子

import fetchJsonp from 'fetch-jsonp';fetchJsonp(`${document.location.protocol}//xxx.com/v1/pages/list`).then((res) => {return res.json();},
);

fetchJsonp函数

主要是利用script标签的src属性来请求api,实现跨域。

function fetchJsonp(_url, options = {}) {// to avoid param reassignlet url = _url;const timeout = options.timeout || defaultOptions.timeout;// defaultOptions.jsonpCallback,默认是'callback'const jsonpCallback = options.jsonpCallback || defaultOptions.jsonpCallback;let timeoutId;return new Promise((resolve, reject) => {// 回调函数名称,字符串类型const callbackFunction =// generateCallbackFunction返回一个随机定义的字符串options.jsonpCallbackFunction || generateCallbackFunction();//用于script标签的idconst scriptId = `${jsonpCallback}_${callbackFunction}`;// 将属性callbackFunction定义在window全局对象上,简单概括就是在window全局对象上定义一个函数window[callbackFunction] = (response) => {// 返回信息resolve({ok: true,// keep consistent with fetch APIjson: () => Promise.resolve(response),});// 清除定时器if (timeoutId) clearTimeout(timeoutId);removeScript(scriptId);clearFunction(callbackFunction);};// Check if the user set their own params, and if not add a ? to start a list of paramsurl += url.indexOf('?') === -1 ? '?' : '&';// 创建一个script标签const jsonpScript = document.createElement('script');// 设置src属性jsonpScript.setAttribute('src',`${url}${jsonpCallback}=${callbackFunction}`,);// 编码if (options.charset) {jsonpScript.setAttribute('charset', options.charset);}// nonce 全局属性是定义了密码学 nonce(“只使用一次的数字”)的内容属性,内容安全策略可以使用它来确定是否允许对给定元素进行获取。if (options.nonce) {jsonpScript.setAttribute('nonce', options.nonce);}//if (options.referrerPolicy) {jsonpScript.setAttribute('referrerPolicy', options.referrerPolicy);}// 设置跨域if (options.crossorigin) {jsonpScript.setAttribute('crossorigin', 'true');}jsonpScript.id = scriptId;// 返回一个包括所有给定标签名称的元素的 HTML 集合HTMLCollection// 在head标签之后添加script标签document.getElementsByTagName('head')[0].appendChild(jsonpScript);// 定时器timeoutId = setTimeout(() => {reject(new Error(`JSONP request to ${_url} timed out`));// callbackFunction,移除window上的自定义的callbackFunctionclearFunction(callbackFunction);// 移除script标签removeScript(scriptId);//window[callbackFunction] = () => {clearFunction(callbackFunction);};}, timeout);// Caught if got 404/500jsonpScript.onerror = () => {// 抛出错误reject(new Error(`JSONP request to ${_url} failed`));clearFunction(callbackFunction);removeScript(scriptId);if (timeoutId) clearTimeout(timeoutId);};});
}export default fetchJsonp;

defaultOptions变量

const defaultOptions = {timeout: 5000,jsonpCallback: 'callback',jsonpCallbackFunction: null,
};

generateCallbackFunction函数

返回一个自定义的随机字符串

function generateCallbackFunction() {return `jsonp_${Date.now()}_${Math.ceil(Math.random() * 100000)}`;
}

removeScript函数

移除script标签

function removeScript(scriptId) {// 找到script标签const script = document.getElementById(scriptId);// 移除script标签if (script) {document.getElementsByTagName('head')[0].removeChild(script);}
}

clearFunction

移除全局对象window上的自定义方法或属性

function clearFunction(functionName) {// 移除window上自定义属性or方法try {delete window[functionName];} catch (e) {window[functionName] = undefined;}
}

打包

利用Babel库打包

{"scripts": {"prepublish": "npm run lint && npm run clean && npm run build","build": "babel src/ --modules umd --out-dir build","clean": "rm -rf build","lint": "eslint src/"}
}

babel

Babel是一个帮助你用最新版本的JavaScript编写代码的工具。当您的支持环境不支持某些特性时,Babel将帮助您将这些特性编译为支持的版本。

// ES2020 nullish coalescing
function greet(input) {return input ?? "Hello world";
}
function greet(input) {return input != null ? input : "Hello world";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP PP学习笔记24 - 生产订单(制造指图)的创建

上面两章讲了生产订单的元素。 SAP PP学习笔记22 - 生产订单(制造指图)的元素1-CSDN博客 SAP PP学习笔记23 - 生产订单(制造指图)的元素2 - 决济规则(结算规则)-CSDN博客 这一章讲生产订单的创建。比如 - 生产订单的流程&#…

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11(下):YOLO的入门使用一节中,我们已经了解YOLO的使用方法,使用过程非常简单,训练时只需要三行代码:引入YOLO,构建模型,训练模型;预测…

SwiftUI八与UIKIT交互

代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如,可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器,反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…

代码随想录算法训练营第五十二天 | 647. 回文子串、516.最长回文子序列、动态规划总结篇、复习

647. 回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 文档讲解:https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html 视频讲解:https://www.bilibili.com/video/BV17G4y1y7z9/ 思路 确定…

Meta CEO 扎克伯格批评闭源AI竞争对手:称其试图“创造上帝”|TodayAI

美国社交媒体巨头Meta(Facebook母公司)的CEO马克扎克伯格(Mark Zuckerberg)近日在一次采访中,公开批评了那些他认为不够开放的AI竞争对手,称他们的行为就像是在“创造上帝”。扎克伯格坚定表示,AI技术不应该被某一家公…

git如何切换到tag分支

项目场景: 当我们需要回退到某个tag分支。 问题描述 通过git命令 git checkout tag_name 执行这个命令后,会提示你当前处于一个“detached HEAD”的状态。 原因分析: 这是因为tag只是一个快照,是不能更改代码的。 解决方案&am…

SysML与MBSE的关系

SysML与MBSE的关系 对于任何基于模型的系统工程 (MBSE) 方法,推荐的最佳实践是基于模型的语言、基于模型的工具、基于模型的流程和基于模型的架构框架的协同应用,如下图所示 系统架构四元组 图。经过十年将SysML应用于棘手的系统…

2535. 数组元素和与数字和的绝对差

给你一个正整数数组 nums 。 元素和 是 nums 中的所有元素相加求和。数字和 是 nums 中每一个元素的每一数位(重复数位需多次求和)相加求和。 返回 元素和 与 数字和 的绝对差。 注意:两个整数 x 和 y 的绝对差定义为 |x - y| 。 示例 1&a…

面试真题及答题思路(二)

题目 某地为了开发旅游资源,花费 600万元建了一个涉嫌抄袭的牛郎织女雕塑,变成了网红打卡地,也吸引了游客,但是部分网民说太丑,花的钱太多。对此,你怎么看?为了缓解辖区内双职工家庭的育儿压力…

戴尔md3400存储控制器脱机故障 电池故障处理

看了一下网上关于DELL MD系列存储故障处理的文档还是比较少的,最近处理了一些关于MD系列存储的问题,稍微整理整理就分享一下,各位喜欢摸索的朋友可以稍稍做些参考,当然如果想寻求外援的也可以快速的找到合适的人。以便安全又快捷的…

C语言基础——操作符

ʕ • ᴥ • ʔ づ♡ど 🎉 欢迎点赞支持🎉 个人主页:励志不掉头发的内向程序员; 专栏主页:C语言基础; 文章目录 前言 一、操作符的分类 二、二进制和进制转换 2.1 二进制转十进制 2.1.1 十…

零知识证明基础:数字签名

1、绪论 数字签名(Digital Signature),也称电子签名,是指附加在某一电子文档中的一组特定的符号或代码。它利用密码技术对该电子文档进行关信息提取并进行认证形成,用于标识签发者的身份以及签发者对电子文档的认可,并能被接收者…

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # coding=UTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到的帧数保存json文件 time: 2024-6-27 author: cong…

详细介绍LP-SCADA系统的核心数据采集单元

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 SCADA系统的数据采集功能是其核心组成部分,它允许系统从各种传感器、仪器和设备中收集实时数据。以下是SCADA系统数据采集功能的详细描述: 传感器和…

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨…

Java对象类辨识指南:Object与Objects类的区别详解

今天在写lambda表达式时,用filter来做过滤判断我的结果是否为null时使用到了Objects.nonNull,但是敲着敲着发现不对劲,怎么没有nonNull方法?? 其实时我少敲了一个s,当时自己并没有很清楚Object和Objects两者之前的区别&#xf…

LangGPT:高质量提示词框架

题目:LangGPT: Rethinking Structured Reusable Prompt Design Framework for LLMs from the Programming Language作者: Ming Wang; Yuanzhong Liu; Xiaoming Zhang; Songlian Li; Yijie Huang; Chi Zhang; Daling Wang; Shi Feng; Jigang LiDOI: 10.48550/arXiv.2…

Qt自定义信号

1.Teacher类下定义信号signals: Student类下定义槽函数&#xff1a; Teacher.h #pragma once#include <QObject>class Teacher : public QObject {Q_OBJECTpublic:Teacher(QObject *parent);~Teacher(); signals:void Ask(); //老师向学生提问void Ask(QString str);…

使用response.sendRedirect实现页面重定向

使用response.sendRedirect实现页面重定向 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊一聊在Java中如何使用response.sendRedirect方法实现页面…

量化投资 日周月报 2024-06-28

文章 深度学习在量化交易中的应用:在BigQuant量化交易平台的文章中,探讨了深度学习在量化交易中,特别是在因子挖掘方面的应用。文章提到,随着传统线性模型的潜力逐渐枯竭,非线性模型逐渐成为量化交易的主要探索方向。深度学习因其对非线性关系的拟合能力,在量化交易中展现…