精华内容
下载资源
问答
  • 但是我们可以通过中断调用链或中断Promise来模拟请求中断. 中断调用链 中断调用链就是在某一个then/catch执行之后,后续的链式调用(包括then,catch,finally)不再继续执行. 方法是在then/catch返回一个新的Promise...

    1 Promise

    Promise有一个缺点是一旦创建无法取消,所以本质上Promise是无法被终止的.

    但是我们可以通过中断调用链中断Promise来模拟请求的中断.

    中断调用链

    中断调用链就是在某一个then/catch执行之后,后续的链式调用(包括then,catch,finally)不再继续执行.

    方法是在then/catch返回一个新的Promise实例,并保持pending状态:

    new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('result');
        });
    }).then(res => {
        // 达到某种条件,return一个pending状态的Promise实例,以中断调用链
        if (res === 'result') {
            return new Promise(() => {});
        }
        console.log(res); // 不打印
    }).then(() => {
        console.log('then不执行'); // 不打印
    }).catch(() => {
        console.log('catch不执行'); // 不打印
    }).finally(() => {
        console.log('finally不执行'); // 不打印
    });
    

    中断Promise

    中断Promise不等同于中止Promise,因为Promise是无法被终止的.

    这里的中断指的是,在合适的时机,把pending状态的promisereject掉.例如一个常见的应用场景就是给网络请求设置超时时间,一旦超时就中断.

    老规矩,用setTimeout来模拟网络请求.阀值设置为Math.random() * 3000表示随机3秒之内返回结果.

    const request = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('收到服务端数据')
      }, Math.random() * 3000)
    })
    

    假设超过2秒就是网络超时,我们可以封装一个超时处理函数.

    由于网络请求所需的事件是随机的,因此可以利用Promise.race方法,达到超时reject的目的.

    const timeoutReject = (p1, timeout = 2000) => {
        const p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                reject('网络超时');
            }, timeout);
        });
        return Promise.race([p1, p2]);
    };
    
    timeoutReject(request).then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    });
    

    包装abort方法——仿照AxiosCancelToken

    上面实现的方式并不灵活,因为中断Promise的方式有很多,不单单是网络超时.

    我们可以仿照AxiosCancelToken的核心源码,简单包装一个abort方法,供使用者随时调用.

    function abortWrapper(p1) {
        let abort;
        const p2 = new Promise((resolve, reject) => {
            abort = reject;
        });
        // 如果没有resolve或reject,p2的状态永远是pending
        const p = Promise.race([p1, p2]);
        p.abort = abort;
        return p;
    }
    
    const req = abortWrapper(request);
    req.then(res => {
        console.log(res);
    }).catch(err => {
        console.log(err);
    });
    
    setTimeout(() => {
        // 手动调用req.abort,将p2的状态改变为rejected
        req.abort('手动中断请求');
    }, 2000);
    

    如此封装的主要目的就是为了能够在Promise外部控制其resolvereject,让使用者可以随时手动调用resolve(触发.then)reject(触发.catch).

    需要注意的是,虽然Promise请求被中断了,但是promise并没有终止,网络请求依然可能返回,只不过那时我们已经不关心请求结果了.

    2 RXJSunsubscribe方法

    rxjs本身提供了取消订阅的方法,即unsubscribe.

    let stream1$ = new Observable(observer => {
        let timeout = setTimeout(() => {
            observer.next('observable timeout');
        }, 2000);
    
        return () => {
            clearTimeout(timeout);
        }
    });
    let disposable = stream1$.subscribe(value => console.log(value));
    setTimeout(() => {
        disposable.unsubscribe();
    }, 1000);
    

    3 AxiosCancelToken

    AxiosCancelToken有两种使用方法:

    • 方法一

      import axios from 'axios';
      const CancelToken = axios.CancelToken;
      const source = CancelToken.source();
      
      axios.get('/user/12345', {
        cancelToken: source.token
      }).catch(function (thrown) {
        if (axios.isCancel(thrown)) {
          console.log('Request canceled', thrown.message);
        } else {
          // handle error
        } 
      });
      
      source.cancel('Operation canceled by the user.');
      
    • 方法二

      import axios from 'axios';
      const CancelToken = axios.CancelToken;
      
      // 创建一个变量如 cancel 用于存储这个中断某个请求的方法
      let cancel;
      
      axios.get('/user/12345', {
        cancelToken: new CancelToken(function executor(c) {
          cancel = c; // 将参数 c 赋值给 cancel
        })
      });
      
      // 判断 cancel 是否为函数,确保 axios 已实例化一个CancelToken
      if (typeof cancel === 'function') {
          cancel();
          cancel = null;
      }
      

    CancelToken的核心源码:(axios/lib/cancel/CancelToken.js)

    'use strict';
    
    var Cancel = require('./Cancel');
    
    /**
     * A `CancelToken` is an object that can be used to request cancellation of an operation.
     *
     * @class
     * @param {Function} executor The executor function.
     */
    function CancelToken(executor) {
      if (typeof executor !== 'function') {
        throw new TypeError('executor must be a function.');
      }
    
      var resolvePromise;
      this.promise = new Promise(function promiseExecutor(resolve) {
        resolvePromise = resolve;
      });
    
      var token = this;
      executor(function cancel(message) {
        if (token.reason) {
          // Cancellation has already been requested
          return;
        }
    
        token.reason = new Cancel(message);
        resolvePromise(token.reason);
      });
    }
    
    /**
     * Throws a `Cancel` if cancellation has been requested.
     */
    CancelToken.prototype.throwIfRequested = function throwIfRequested() {
      if (this.reason) {
        throw this.reason;
      }
    };
    
    /**
     * Returns an object that contains a new `CancelToken` and a function that, when called,
     * cancels the `CancelToken`.
     */
    CancelToken.source = function source() {
      var cancel;
      var token = new CancelToken(function executor(c) {
        cancel = c;
      });
      return {
        token: token,
        cancel: cancel
      };
    };
    
    module.exports = CancelToken;
    

    可以看到,在Axios底层,CancelToken的核心源码所体现的思想,与上面中断Promise包装abort方法的思想一致.

    只不过Axios在外部手动调用resolve(用户触发cancel方法),而resolve一旦调用,就会触发promisethen方法,来看这个promise.then的源码:(axios/lib/adapters/xhr.js)

    if (config.cancelToken) {
      // Handle cancellation
      config.cancelToken.promise.then(function onCanceled(cancel) {
        if (!request) {
          return;
        }
    
        request.abort();
        reject(cancel);
        // Clean up request
        request = null;
      });
    }
    

    可以看到then方法中会执行abort方法取消请求,同时调用reject让外层的promise失败.

    展开全文
  • x86处理器如何处理MSI-X中断请求PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包...

    x86处理器如何处理MSI-X中断请求

    PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据。只是MSI-X中断机制为了支持更多的中断请求,在MSI-X Capablity结构中存放了一个指向一组Message Address和 Message Data字段的指针,从而一个PCIe设备可以支持的MSI-X中断请求数目大于32个,而且并不要求中断向量号连续。MSI-X机制使用的这组Message Address和 Message Data字段存放在PCIe设备的BAR空间中,而不是在PCIe设备的配置空间中,从而可以由用户决定使用MSI-X中断请求的数目。

    当系统软件初始化PCIe设备时,如果该PCIe设备使用MSI-X机制传递中断请求,需要对MSI-X Capability结构指向的Message Address和Message Data字段进行设置,并使能MSI-X Enable位。x86处理器在此处的实现与PowerPC处理器有较大的不同。

    Message Address字段和Message Data字段的格式

    在x86处理器系统中,PCIe设备也是通过向Message Address写入Message Data指定的数值实现MSI/MSI-X机制。在x86处理器系统中,PCIe设备使用的Message Adress字段和Message Data字段与PowerPC处理器不同。

    1 PCIe设备使用Message Adress字段

    在x86处理器系统中,PCIe设备使用的Message Address字段仍然保存PCI总线域的地址,其格式如图6 7所示。

    其中第31~20位,存放FSB Interrupts存储器空间的基地址,其值为0xFEE。当PCIe设备对0xFEEX-XXXX这段“PCI总线域”的地址空间进行写操作时,MCH/ICH将会首先进行“PCI总线域”到“存储器域”的地址转换,之后将这个写操作翻译为FSB总线的Interrupt Message总线事务,从而向CPU内核提交中断请求。

    x86处理器使用FSB Interrupt Message总线事务转发MSI/MSI-X中断请求。使用这种方法的优点是向CPU内核提交中断请求的同时,提交PCIe设备使用的中断向量,从而CPU不需要使用中断响应周期从寄存器中获得中断向量。FSB Interrupt Message总线事务的详细说明见下文。

    Message Address字段其他位的含义如下所示。

    • Destination ID字段保存目标CPU的ID号,目标CPU的ID与该字段相等时,目标CPU将接收这个Interrupt Message。FSB Interrupt Message总线事务可以向不同的CPU提交中断请求。

    • RH(Redirection Hint Indication)位为0时,表示Interrupt Message将直接发向与Destination ID字段相同的目标CPU;如果RH为1时,将使能中断转发功能。

    • DM(Destination Mode)位表示在传递优先权最低的中断请求时,Destination ID字段是否被翻译为Logical或者Physical APIC ID。在x86处理器中APIC ID有三种模式,分别为Physical、Logical和Cluster ID模式。• 如果RH位为1且DM位为0时,Destination ID字段使用Physical模式;如果RH位为1且DM位为1,Destination ID字段使用Logical模式;如果RH位为0,DM位将被忽略。

    以上这些字段的描述与x86处理器使用的APIC中断控制器相关。对APIC的详细说明超出了本书的范围,对此部分感兴趣的读者请参阅Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1。

    2 Message Data字段

    Message Data字段的格式如图6 8所示。

    Trigger Mode字段为0b0x时,PCIe设备使用边沿触发方式申请中断;为0b10时使用低电平触发方式;为0b11时使用高电平触发方式。MSI/MSI-X中断请求使用边沿触发方式,但是FSB Interrupt Message总线事务还支持Legacy INTx中断请求方式,因此在Message Data字段中仍然支持电平触发方式。但是对于PCIe设备而言,该字段为0b0x。

    Vector字段表示这个中断请求使用的中断向量。FSB Interrupt Message总线事务在提交中断请求的同时,将中断向量也通知给处理器。因此使用FSB Interrupt Message总线事务时,处理器不需要使用中断响应周期通过读取中断控制器获得中断向量号。与PowerPC的传统方式相比,x86处理器的这种中断请求的效率较高[①]。

    值得注意的是,在x86处理器中,MSI机制使用的Message Data字段与MSI-X机制相同。但是当一个PCIe设备支持多个MSI中断请求时,其Message Data字段必须是连续的,因而其使用的Vector字段也必须是连续的,这也是在x86处理器系统中,PCIe设备支持多个MSI中断请求的问题所在,而使用MSI-X机制有效避免了该问题。

    Delivery Mode字段表示如何处理来自PCIe设备的中断请求。

    • 该字段为0b000时,表示使用“Fixed Mode”方式。此时这个中断请求将被Destination ID字段指定的CPU处理。

    • 该字段为0b001时,表示使用“Lowest Priority”方式。此时这个中断请求将被优先权最低的CPU处理。当使用“Fixed Mode”和“Lowest Priority”方式时,如果Vector字段有效,CPU接收到这个中断请求之后,将使用Vector字段指定的中断向量处理这些中断请求;而当Delivery Mode字段为其他值时,Message Data字段中所包含的Vector字段无效。

    • 该字段为0b010时,表示使用SMI方式传递中断请求,而且必须使用边沿触发,此时Vector字段必须为0。这个中断请求将被Destination ID字段指定的CPU处理。

    • 该字段为0b100时,表示使用NMI方式传递中断请求,而且必须使用边沿触发,此时Vector字段和Trigger字段的内容将被忽略。这个中断请求将被Destination ID字段指定的CPU处理。

    • 该字段为0b101时,表示使用INIT方式传递中断请求,Vector字段和Trigger字段的内容将被忽略。这个中断请求将被Destination ID字段指定的CPU处理。

    • 该字段为0b111时,表示使用INTR信号传递中断请求且使用边沿触发。此时MSI中断信息首先传递给中断控制器,然后中断控制器在通过INTR信号向CPU传递中断请求,之后CPU在通过中断响应周期获得中断向量。上文中PowerPC处理器使用的方法与此方法类似。而在x86处理器中多使用Interrupt Message总线事务进行MSI中断信息的传递,因此这种模式很少被使用。

    边沿触发和电平触发是中断请求常用的两种方式。其中电平触发指外部设备使用逻辑电平1(高电平触发)或者0(低电平触发),提交中断请求。使用电平或者边沿方式提交中断请求时,外部设备一般通过中断线(IRQ_PIN#)与中断控制器相连,其中多个外部设备可能通过相同的中断线与中断控制器相连(线与或者与门)。

    外部设备在使用低电平触发,提交中断请求的过程中,首先需要将IRQ_PIN#信号驱动为低。当中断控制器将该中断请求提交给处理器,而且处理器将这个中断请求处理完毕后,处理器将通过写外部设备的某个寄存器来清除此中断源,此时外部设备将不再驱动IRQ_PIN#信号线,从而结束整个中断请求。

    IRQ_PIN#信号线可以被多个外部设备共享,在这种情况之下,只有所有外部设备都不驱动IRQ_PIN#信号线时,IRQ_PIN#信号才为高电平。采用电平触发方式进行中断请求的优点是不会丢失中断请求,而缺点是一个优先权较高的中断请求有可能会长期占用中断资源,从而使其他优先权较低的中断不能被及时提交。因为优先级别较高的中断源有可能会持续不断地驱动IRQ_PIN#信号。

    而边沿触发使用上升沿(0到1)或者下降沿(1到0)作为触发条件,但是中断控制器并不是使用这个“边沿”作为触发条件。中断控制器使用内部时钟对IRQ_PIN#信号进行采样,如果在前一个时钟周期,IRQ_PIN#信号为0,而后一个时钟周期,IRQ_PIN#信号为1,中断控制器认为外部设备提交了一个有效“上升沿”,中断控制器会锁定这个“上升沿”并向处理器发出中断请求。这也是外部设备至少需要将IRQ_PIN#信号保持一个时钟采样周期的原因,否则中断控制器可能无法识别本次边沿触发的中断请求,从而产生Spurious中断请求。

    外部设备使用“上升沿”进行中断申请时,不需要持续地将IRQ_PIN#信号驱动为1,而只需要保证中断控制器可以进行正确采样这些中断信号即可。在处理边沿触发中断请求时,处理器不需要清除中断源。

    使用边沿触发可以有效避免“优先级别”较高的中断源长期占用IRQ_PIN#信号的情况,使用“下降沿”触发进行中断请求与“上升沿”触发类似。

    但是外部设备使用边沿触发方式时,有可能会丢失一些中断请求。例如在一个处理器系统中,存在一个定时器,这个定时器使用上升沿触发方式向中断控制器定时提交中断。如果当处理器正在处理这个定时器的上一个中断请求时,将不会处理这个定时器发出的其他“边沿”中断请求,从而导致中断丢失。而使用电平触发方式不会出现这类问题,因为电平触发方式是一个“持续”过程,处理器只有处理完毕当前中断,并清除相应中断源之后,才会处理下一个中断源。

    MSI中断请求实际上和边沿触发方式非常类似,MSI中断请求通过存储器写TLP实现,这个写动作是一个瞬间的动作,并不是一个持续请求,因此在x86处理器中MSI中断请求使用边沿触发进行中断请求。

    还有一些外部设备可以通过I/O APIC进行中断请求[②],这些I/O APIC接收的外部中断需要标明是使用边沿或者电平触发,I/O APIC使用FSB Interrupt Message总线事务将中断请求发向Local APIC,并由Local APIC向处理器提交中断请求。

    FSB Interrupt Message总线事务

    与MPC8572处理器处理MSI中断请求不同,x86处理器使用FSB的Interrupt Message总线事务,处理PCIe设备的MSI/MSI-X中断请求。由上文所示,MPC8572处理器处理MSI中断请求时,首先由MPIC中断控制器截获这个MSI中断请求,之后由MPIC中断控制器向CPU提交中断请求,而CPU通过中断响应周期从MPIC中断控制器的ACK寄存器中获得中断向量。

    采用这种方式的主要问题是,当一个处理器中存在多个CPU时,这些CPU都需要通过中断响应周期从MPIC中断控制器的ACK寄存器中获得中断向量。在一个中断较为密集的应用中,ACK寄存器很可能会成为系统瓶颈。而采用Interrupt Message总线事务可以有效地避免这种系统瓶颈,因为使用这种方式中断信息和中断向量将同时到达指定的CPU,而不需要使用中断响应周期获得中断向量。

    x86处理器也具有通过中断控制器提交MSI/MSI-X中断请求的方法,在I/O APIC具有一个 “The IRQ Pin Assertion Register”寄存器,该寄存器地址为0xFEC00020[③],其第4~0位存放IRQ Number。系统软件可以将PCIe设备的Message Address寄存器设置为0xFEC00020,将Meaasge Data寄存器设置为相应的IRQ Number。

    当PCIe设备需要提交MSI中断请求时,将向PCI总线域的0xFEC00020地址写入Message Data寄存器中的数据。此时这个存储器写请求将数据写入I/O APIC的The IRQ Pin Assertion Register中,并由I/O APIC将这个MSI中断请求最终发向Local APIC,之后再由Local APIC通过INTR#信号向CPU提交中断请求。

    上述步骤与MPC8572处理器传递MSI中断的方法类似。在x86处理器中,这种方式基本上已被弃用。下文以图6 9为例,说明x86处理器如何使用FSB总线的Interrupt Message总线事务,向CPU提交MSI/MSI-X中断请求。

    PCIe设备在发送MSI/MSI-X中断请求之前,系统软件需要合理设置PCIe设备MSI/MSI-X Capability寄存器,使Message Address寄存器的值为0xFEExx00y[④],同时合理地设置Message Data寄存器Vector字段。

    PCIe设备提交MSI/MSI-X中断请求时,需要向0xFEExx00y地址写Message Data寄存器中包含的数据,并以存储器写TLP的形式发送到RC。如果ICH收到这个存储器写TLP时,将通过DMI接口将这个TLP提交到MCH。MCH收到这个TLP后,发现这个TLP的目的地址在FSB Interrupts存储器空间中,则将PCIe总线的存储器写请求转换为Interrupt Message总线事务,并在FSB总线上广播。

    FSB总线上的CPU,根据APIC ID信息,选择是否接收这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断服务例程,而不需要从APIC中断控制器获得中断向量。与PowerPC处理器的MPIC中断控制器相比,这种方法更具优势。


    [①] P4080处理器也提供了一种类似于FSB Interrupt Message总线事务的中断请求方法。

    [②] 与I/O APIC的IRQX#引脚链接的外部设备。

    [③] 该寄存器在存储器域和PCI总线域中的地址都为0xFEC00020。

    [④] 其中xx表示APIC ID,而y为RH+DM。

    推荐阅读

    【Vivado那些事】如何查找官网例程及如何使用官网例程

    【Vivado使用误区与进阶】总结篇

    【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键

    SystemVerilog数字系统设计_夏宇闻 PDF

    图书推荐|ARM Cortex-M0 全可编程SoC原理及实现

    1202年了,还在使用虚拟机吗?Win10安装Ubuntu子系统及图形化界面详细教程

    Github 上有哪些优秀的 VHDL/Verilog/FPGA 项目

    AD936x+ZYNQ搭建OpenWIFI

    无招胜有招-Vivado非工程模式下的详细设计

    追寻ARM的起源-Acorn电脑简史及FPGA实现

    面试中经常会遇到的FPGA基本概念,你会几个?

    Xilinx FPGA MIPI 接口简单说明

    介绍一些新手入门FPGA的优秀网站

    Vivado ML(机器学习) 2021尝鲜

    推荐一些可以获取免费的国外的原版书籍(电子版)网站

    【Vivado那些事】FPGA的配置方式

    FPGA 的重构

    浅析FPGA局部动态可重构技术

    ISP(图像信号处理)算法概述、工作原理、架构、处理流程

    国产CPU概括

    浅谈PCI Express体系结构(一)

    浅谈PCI Express体系结构(二)

    从电子游戏历史看IC发展的助推剂

    80年代电子游戏及电脑游戏的发展历史

    PCIe总线的基础知识

    万字长文带你回顾电子游戏的七十多年历史(完整版)

    FPGA中异步复位,同步释放的理解

    OpenFPGA系列文章总结

    用Verilog设计一个16 位 RISC 处理器

    介绍一些新手入门FPGA的优秀网站(新增)
    如何提高FPGA的工作频率

    点击上方字体即可跳转阅读

    展开全文
  • 先来说一说“中断请求”的实际场景,当页面有多个tab页签时,每次切换页签都会去请求数据,频繁的切换就会去请求很多次,比如A页签切换到B页签,A页签请求完全是不必要的,这时候可以在切换时中断请求。...

    先来说一说“中断请求”的实际场景,当页面有多个tab页签时,每次切换页签都会去请求数据,频繁的切换就会去请求很多次,比如A页签切换到B页签,A页签请求完全是不必要的,这时候可以在切换时中断请求。

    AbortController实验室功能,已经在主流浏览器实现,IE浏览器可以不支持,需要导入polyfill。

    AbortController接口表示一个控制器对象,允许你根据需要中止一个或多个 Web请求。官网参考:https://developer.mozilla.org...

    1、axios

    axios已经实现AbortController,具体实践如下:// fontend

    import React, { useEffect } from 'react';

    import axios from 'axios';

    const AbortController = () => {

    const CancelToken = axios.CancelToken;

    const source = CancelToken.source();

    useEffect(() => {

    axios.post('http://127.0.0.1:8088/getData', {name: 'zs', pwd: '123456'}, {cancelToken: source.token})

    .then(res => {

    console.log(res);

    })

    }, []);

    const abort = () => {

    source.cancel('cancle request!');

    }

    return (

    <>

    this is a abortController page.
    取消请求

    >

    )

    }

    export default AbortController;// backend

    const express = require('express');

    const cors = require('cors');

    const bodyParser = require('body-parser')

    const app = express();

    app.use(cors({

    origin: '*',

    allowedHeaders: ['content-type'],

    }))

    app.use(bodyParser.json());

    app.use(bodyParser.urlencoded({ extended: true }));

    app.post('/getData', (req, res) => {

    const {name, pwd} = req.body;

    if (!name || !pwd) {

    return res.json({

    code: 200,

    data: {},

    errorMessage: '参数不能为空'

    })

    }

    setTimeout(() => {

    res.json({

    code: 200,

    data: {name, pwd},

    errorMessage: '参数不能为空'

    })

    }, 5000);

    })

    app.listen(8088, () => {

    console.log('server is listening 8088');

    })

    bVcH5bu

    早期切换页签时可以将source.cancel()放在useEffect返回函数里面执行,当页签下组件销毁时就取消请求

    来看看axios是如何实现请求中断的,大致原理是从外部操作中断内部promise流function CancelToken(executor) {

    if (typeof executor !== 'function') {

    throw new TypeError('executor must be a function.');

    }

    var resolvePromise;

    this.promise = new Promise(function promiseExecutor(resolve) {

    resolvePromise = resolve;

    });

    var token = this;

    executor(function cancel(message) {

    if (token.reason) {

    // Cancellation has already been requested

    return;

    }

    token.reason = new Cancel(message);

    resolvePromise(token.reason);

    });

    }

    CancelToken.source = function source() {

    var cancel;

    var token = new CancelToken(function executor(c) {

    cancel = c;

    });

    return {

    token: token,

    cancel: cancel

    };

    };

    c指cancel函数,当执行source.cancel()时从外部去操作CancelToken的私有属性resolvePromise,也就是resolve函数。

    2、fetch

    fetch直接使用AbortController来中断请求,详细如下:

    首先安装abort-controller库,该库实现了web abort-controller。yarn add abort-controller -Simport React, { useEffect } from 'react';

    import Controller from 'abort-controller';

    const AbortController = () => {

    const abortController = new Controller();

    useEffect(() => {

    fetch('http://127.0.0.1:8088/getData', {

    method: 'POST',

    headers: {

    'Content-Type': 'application/json'

    },

    body: JSON.stringify({

    name: 'zs',

    pwd: '123456'

    }),

    signal: abortController.signal

    })

    }, []);

    const abort = () => {

    abortController.abort()

    }

    return (

    <>

    this is a abortController page.
    取消请求

    >

    )

    }

    export default AbortController;

    3、$.ajax

    $.ajax内部已经实现了abort功能。ajax(settings?: JQuery.AjaxSettings): JQuery.jqXHR;

    interface jqXHR extends Promise3, never,

    Ajax.SuccessTextStatus, Ajax.ErrorTextStatus, never,

    jqXHR, string, never>,

    Pick

    'setRequestHeader' | 'status' | 'statusText'>,

    Partial> {

    responseJSON?: any;

    // 中断请求

    abort(statusText?: string): void;

    state(): 'pending' | 'resolved' | 'rejected';

    statusCode(map: Ajax.StatusCodeCallbacks): void;

    }

    具体例子:import React, { useEffect } from 'react';

    import $ from 'jquery';

    const AbortController = () => {

    var abortController: JQuery.jqXHR | null = null;

    useEffect(() => {

    abortController = $.ajax({

    url: 'http://127.0.0.1:8088/getData',

    method: 'POST',

    headers: {

    'Content-Type': 'application/json'

    },

    data: JSON.stringify({

    name: 'zs',

    pwd: '123456'

    }),

    success: function(res) {

    console.log(res)

    }

    })

    }, []);

    const abort = () => {

    abortController?.abort()

    }

    return (

    <>

    this is a abortController page.
    取消请求

    >

    )

    }

    export default AbortController;

    展开全文
  • 某个中断请求被响应后,就存在着一个中断请求的撤销问题。 1.定时器/计数器T0、T1中断请求的撤销 ...电平方式中断请求的撤销,其中中断请求标志自动撤销,但中断请求信号的低电平可能继续存在,.

    • 某个中断请求被响应后,就存在着一个中断请求的撤销问题。

    1.定时器/计数器T0、T1中断请求的撤销

    • 硬件会自动把中断请求标志位(TF0或TF1)清0,自动撤销

    2.外部中断请求的撤销

    (1)跳沿方式外部中断请求的撤销

    • 包括两项:中断标志位清0外中断信号的撤销
    • 中断标志位清0是在中断响应后由硬件自动完成的。
    • 外中断请求信号的撤销,由于跳沿信号过后也就消失了,自动撤销

    (2)电平方式外部中断请求的撤销

    • 电平方式外中断请求的撤销,其中中断请求标志自动撤销,但中断请求信号的低电平可能继续存在,为此,除了标志位清“0”之外,还需在中断响应后把中断请求信号输入引脚从低电平强制改变为高电平,如图4-9所示。
    图4-9 电平方式的外部中断请求的撤销电路
    • 由图4-9,用D触发器锁存外来的中断请求低电平,并通过D触发器的输出端Q接到INT0*(或 INT1* )。所以,增加的D触发器不影响中断请求。
    • 中断响应后,利用D触发器的SD端接AT89S51的P1.0端。因此,只要P1.0端输出一个负脉冲就可以使D触发器置“1”,撤销低电平的中断请求信号。
    • 负脉冲可在中断服务程序中增加如下指令:
    	ORL   P1,#01H		;P1.0为“1”
    	ANL   P1,#0FEH		;P1.0为“0”
    	ORL   P1,#01H		;P1.0为“1”
    

    3.串行口中断请求的撤销

    • 响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标志位,以判定是接收操作还是发送操作,然后才清除。所以串行口中断请求的撤销只能使用软件的方法,在中断服务程序中进行,即用如下指令在中断服务程序中对串行口中断标志位进行清除:
      CLR TI ;清TI标志位
      CLR RI ;清RI标志位

    4.定时器/计数器T2中断请求的撤销

    • 定时器/计数器T2的中断请求包括两种:TF2和EXF2。
    • 上述两种中断请求,在满足中断响应条件时,CPU都将响应其中断请求,转向同一个中断矢量地址。因此,必须在T2的中断服务程序中对TF2和EXF2两个中断请求标志位进行查询,然后正确转入对应的中断处理程序。
    • 中断结束后,中断请求标志位TF2或EXF2必须由软件清0。所以定时器/计数器T2中断请求的撤销只能使用软件的方法,在中断服务程序返回前完成。
    展开全文
  • AbortController中断请求

    2021-10-11 15:45:24
    (3)通过控制器的 abort() 方法,中断请求。 二、事例 (1)upload函数签名 /** @name 上传到OSS */ upload = async ( file: File, path: string, observe?: (ob: FetchObserver) => voi..
  • <script> import axios from 'axios' import qs from 'qs' export default { methods: { request(keyword) { var that = this;... var CancelToken = axios.CancelToken var source = CancelToken.source() ...
  • 这时候并没有看到中断请求的操作,具体的逻辑是在 listener 内部,这样写的原因就是可以进行解耦,提高代码的复用性。 另外还有一个 unsubscribe 取消订阅就不再展开了。 这就是典型的订阅发布模式。 取消请求 最...
  • cpu在处理事件A,突然发生中断请求事件B,cpu迅速去处理事件B,直到事件B处理完毕后,再返回到原来执行的事件A中,这一过程被称为中断 中断源 中断源 名称 中断原因 中断号 /INT0 外部中断0 P3.2引脚低电平...
  • 外部中断0(INT0)和外部中断1(INT1)均有两种触发方式:上升沿或下降沿均可触发方式和仅下降沿触发方式。 因为引脚的状态有0和1,0代表低电平,1代表高电平。从高电平变为低电平,这种电平突然下降的地方叫做下降...
  • } return promise } function dispatchRequest(config) { return xhrAdapter(config).then(response => { // 请求成功 return response }, reason => { // 请求失败 Promise.reject(reason) }) } function ...
  • 在项目中可能遇到以下场景: ... 页面存在定时轮询业务,即固定间隔一段时间再次发起请求,这样就可能存在多个请求间的竞争关系,如果上一个请求的响应速度比最近一次请求的响应速度慢,则前者就会覆盖
  • 请求强制中断

    2021-01-13 14:45:15
    创建 url请求缓存列表 urlList 设置axios请求拦截器,调用stopRequestUrl函数,判断是否拦截 设置axios响应拦截器,调用 dropResponseUrl 函数,把缓存地址列表中的地址抛出去,避免下次请求被拦截 let urlList = ...
  • XMLHttpRequest的停止方法XMLHttpRequest.abort();示例:var xhr = new XMLHttpRequest(),method = "GET",url = ...xhr.open(method, url, true);xhr.send();if (OH_NOES_WE_NEED_TO_CANCEL_R...
  • CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。...
  • 标签:如何解决irq冲突it如何解决IRQ冲突轻松分配板卡资源...什么是IRQ那么,什么是IRQ(中断请求)呢?中断请求是由某个设备发出并同时请求CPU产生中断的一个请求响应信号。通常情况下,计算机是根据中断请求的优先...
  • 如下所示:接入 axios ,在POST方法里加入 cancelToken 数据,在上面else中,中断请求和请求出错都会走那里,所以用一个msg来识别(因为接口返回中也有一个msg,统一一下);以下是 中断请求的方法,放在 路由切换的监听 ...
  • 由于上一页面请求执行时间长,切换到该页面时,还未执行完,这时那个请求仍会继续执行直到请求结束,此时将会影响页面性能,并且可能对现在页面的数据显示造成一定影响,所以我们应该,切换页面前中断前面所有请求。...
  • 如下所示:Vue.prototype.$ajax=axios;const CancelToken = axios.CancelToken...let cancelAjaxText = '中断成功';Vue.prototype.post = function(url,data,loading){var ajax = Vue.prototype.$ajax({method: 'pos...
  • Requests 如何中断请求

    千次阅读 2020-12-24 21:31:55
    python中的requests如何中断请求呢? 我是多线程并发去get,但是没找到停止请求操作,只能wait线程结束,我以前用过socket套接字,里面写个状态停止read那种就可以。 requests没找到类似的方法。import requestsfrom...
  • 今天刚好有位同事问我,用Java请求Http的时候,有时候不希望阻塞太长时间,想做个监视然后可以中断请求的。他的请求是放在独立线程中的,那么怎样中断一个请求?我们先看看Thread的interrupt方法,能否做到这...
  • axios 利用CancelToken中断请求 1.发送请求处   一般我们将axois请求封装为request.js文件并暴露出接口以便外部使用。在外部调用的过程中,如遇到不符合要求或需要新增的config参数是允许覆盖和新增的,编写如下: ...
  • 下面我就为大家分享一篇vue axios 在页面切换时中断请求方法 ajax,具有很好的参考价值,希望对大家有所帮助。如下所示:Vue.prototype.$ajax=axios;const CancelToken = axios.CancelToken;let cancel;let ...
  • vue+axios中断正在发送的请求

    千次阅读 2021-02-25 15:00:53
    axios内部提供axios.CancelToken.source().cancel()方法用于取消正在发送的请求,我们可以利用这个去处理 简单的api封装,具体看公司项目的封装方式 import axios from 'axios' export function getDataList ...
  • 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序)。 #include<...
  • 中断方式细节

    2021-07-16 14:01:03
    程序中断方式 中断的概念: 如果在程序的执行过程中,如果发生意外事件,或者特殊...IO接口中的中断请求触发器由外部设备来设置,外部设备能否向CPU发送中断请求还得看一下这个中断是否会被屏蔽掉。因为有的时候,CPU
  • 关于js中断ajax请求

    2020-12-22 12:34:42
    停止javascript的ajax请求,一种是设置超时时间让ajax自动断开,另一种为手动去停止ajax请求,其核心是调用XMLHttpRequest对象上的abort方法,这里,我们以jquery举例说明:jquery的ajax对象的abort方法调用abort后...
  • 我在专用于执行spring android请求的线程中使用spring android.我无法实现终止从Spring android(例如getForObject)启动的请求....中断线程>获取其余模板的请求工厂并调用destroy>获得工厂的连接管理器并致电...
  • CPU启动I/O后,不必查询I/O是否准备好,当I/O准备就绪后,发出DMA请求,此时CPU不直接参与I/O和主存间的信心交换,只是把外部总线的使用权暂时交付DMA,仍然可以完成自身内部的操作,所以不必中断现行程序,只需暂停...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 301,061
精华内容 120,424
关键字:

中断请求方式