jsonp请求原生实现

本文介绍了JSONP的工作原理,通过HTML script标签的跨域特性,利用前端传递的回调函数名,由服务器端PHP动态生成并返回JavaScript代码,从而实现数据交互。文中详细阐述了前端的JSONP请求过程,服务器端的实现方法,以及如何处理超时和避免影响后续数据返回的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jsonp原理

通过html中的script标签的跨域能力实现与服务器端的数据交互,解决ajax不能跨域的缺点。后端使用php编程,前端传输一个回调函数的名字,php中通过echo这个函数,可以实现在前端执行这个回调函数。

前端jsonp请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        window.callback_jsonp = function (flag) {
            clearTimeout(window.jsonp_timer);
            console.log('请求成功');
        };
        // 3s超时处理,避免服务器端出错
        window.jsonp_timer = setTimeout(function () {
            window.callback_jsonp = function () {
                console.log('jsonp请求超时后返回数据');
            };
            console.log('jsonp请求超时');
        }, 3000);
        var new_script = document.createElement('script');
        new_script.src = "//localhost/index.php?callback=window.callback_jsonp";
        document.body.appendChild(new_script);
        console.log('jsonp请求');
    </script>
</body>
</html>

服务器端实现

<?php
    $data = true;
    $callback = $_GET['callback'];
    sleep(10);
    echo $callback.'('.json_encode($data).')';
?>

结果

  1. 首先输出“jsonp请求”,说明请求是异步的,不会阻塞线程
  2. 然后输出“jsonp请求超时”,说明超时处理有效
  3. 最后输出“jsonp请求超时后返回数据”,说明可以通过重置回调函数避免超时处理后,服务器成功返回数据,依然有回调函数中的代码执行
### 西门子S7-1500T PLC 控制使用方法教程 #### 一、概述 控制是指控制系统能够按照预定的路径使运动部件从一个位置平滑过渡到另一个位置的过程。对于西门子S7-1500T PLC而言,其具备强大的运动控制功能,可以实现直线、圆弧等多种形式的操作[^1]。 #### 二、硬件准备 为了完成控制任务,通常需要配备支持PROFINET通信协议的伺服电机或步进电机作为执行机构;同时还需要安装有SIMOTION软件包的PC机用于编程调试工作。此外,还需确保所使用的PLC模块具有足够的I/O端口数量以满足实际需求,并正确连接各个组件之间的线路[^2]。 #### 三、组态设置 进入STEP 7 Professional V16及以上版本环境,在项目树中右键点击“Technology Objects”,选择新建技术对象(New Technology Object),然后依次添加所需类型的轴(Axis)。针对每根参与运算的轴,都需要单独创建对应的轴对象并配置好相应的参数,比如最大加减速时间常数等性能指标设定。完成后记得保存更改以便后续调用这些预设好的资源进行下一步开发活动[^3]。 #### 四、编程实现 ##### 1. 初始化部分 在OB1或其他合适的组织块内编写如下初始化语句: ```plc // 定义全局变量区 VAR_GLOBAL g_nStatus : INT; // 状态标志位 END_VAR // 主程序入口处加入以下代码片段 IF NOT MCR THEN IF _INIT() = TRUE THEN g_nStatus := 0; END_IF; ENDIF; FUNCTION_BLOCK FB_InitAxes VAR_INPUT bExecute : BOOL; END_VAR VAR_OUTPUT bDone : BOOL; END_VAR VAR_TEMP nResult : DINT; END_VAR bDone := FALSE; IF bExecute AND (g_nStatus = 0) THEN // 对各轴执行回零动作 FOR i:=0 TO MAX_AXES DO MC_HOME(axis[i], ...); END_FOR; // 设置初始条件后置位完成信号 bDone := TRUE; g_nStatus := 1; END_IF; ``` 上述代码实现了当首次启动系统时自动触发一次归原点过程的功能,从而为之后可能涉及到的位置型指令提供可靠的参照系。 ##### 2. 实现具体逻辑 根据不同应用场景下的要求选用适当的方法来构建具体的算法。这里给出一段简单的例子展示如何利用FB_LINEAR_INTERPOLATION函数库来进行两维平面内的线性计算: ```plc PROGRAM P_LinearInterpolationDemo VAR fbLinIntp : FB_LINEAR_INTERPOLATION; rStartPos[2] : REAL := [0.0, 0.0]; // 起始坐标(X,Y) rEndPos[2] : REAL := [100.0, 50.0]; // 终止坐标(X,Y) fSpeed : REAL := 50.0; // 移动速度(mm/s) tDuration : TIME := T#2s; // 总耗时(s) bMoving : BOOL := FALSE; // 是否正在运行标记 END_VAR fbLinIntp( IN_START_POSITION := ADR(rStartPos), IN_END_POSITION := ADR(rEndPos), IN_SPEED := fSpeed, OUT_DURATION => ADR(tDuration), Q_DONE => ADR(bMoving)); IF NOT bMoving THEN // 启动新的周期之前先停止当前所有活动中的轴 STOP_ALL_AXIS(); // 开启新一轮流程 fbLinIntp(IN_EXECUTE := TRUE); ELSE UPDATE_EACH_AXIS_WITH_CURRENT_VALUES(fbLinIntp.OUT_ACTUAL_POSITION); END_IF; ``` 此段伪代码展示了基于给定起点终点信息以及期望达到的速度值自动生成一条理想化的折线轨迹,并指挥关联着的实际物理设备沿该路线平稳前进直至抵达目的地为止的操作方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值