批请求

在页面上发送多个请求,这些请求那么都成功,要么都不成功,类似数据库事务。系统提供“批请求”实现这样的需求。

  • 使用批请求,在请求开始时启动事务,请求结束时提交事务,请求出错则回滚
  • 前端提供三种方式实现批请求
  • 批请求实现原理同分布式事务的实现原理,参考《启用事务》中的说明

使用"批请求"组件

从市场组件中引入“批请求”组件。"批请求"组件提供两个操作:开始批请求和结束批请求,来实现批请求。两个操作之间,调用需要在一个批中执行的组件的操作,例如:数据组件的保存操作和服务组件的请求操作

例如:实现两个数据组件的保存在同一个批请求中执行,设计界面如下图所示

图 0

使用 BatchRequest 类

系统提供 BatchRequest 类,位于 UI2/wxsys/lib/base/batchRequest 目录,用于创建批请求,提交批请求

  • 创建批请求,返回批请求实例
  • 调用其它请求时,携带批请求实例,表示为批请求中的请求
  • 调用批请求实例的执行方法 exec 提交批请求

批请求构造方法提供三个参数,说明如下

  • transaction: 是否启动事务,默认 true
  • concurrent:是否并发执行,默认 false
  • page: 页面对象

BatchRequest 类用法的示例代码如下

        //创建批请求
        let batchReq = new BatchRequest({ page: this, transaction: true, concurrent: false });
        //批请求中的请求
        数据组件.saveData({ batch: batchReq });
        服务组件.send({ batch: batchReq });
        this.request({batch: batchReq }); 
        //提交批请求
        await batchReq.exec();

请求中增加 batch 参数,传入批请求实例,相同 batch 为同一个批请求,没有 batch 参数为立即执行的请求

使用前添加引用,代码如下:

import BatchRequest from "$UI/wxsys/lib/base/batchRequest";

例如:同一批执行三个请求,分别是数据组件的保存、服务请求的发送和普通请求的发送

  • React 示例代码如下
    onJsBatchBtn2Click = async (event) => {
        let batchReq = new BatchRequest({ page: this, transaction: true, concurrent: false });
        this.comp('ordermData').saveData({ batch: batchReq });
        this.comp('serviceRequest').send({ batch: batchReq }); 
        this.request({ url: "$serviceName/oa/person/savePerson", method: "post", batch: batchReq }); 
        await batchReq.exec();
        message.info("保存成功");
    }
  • Vue 示例代码如下
    let onJsBatchBtn2Click = async (event) => {
        let batchReq = new BatchRequest({ page: $page, transaction: true, concurrent: false });
        $page.comp('ordermData').saveData({ batch: batchReq });
        $page.comp('serviceRequest').send({ batch: batchReq }); 
        $page.request({ url: "$serviceName/oa/person/savePerson", method: "post", batch: batchReq }); 
        await batchReq.exec();
        message.info("保存成功");
    }

使用 wx.request.batch 方法

wx.request.batch 方法自动创建 BatchRequest 并执行传入函数,根据函数返回(为 promise 时等待 promise)执行 BatchRequest.exec() 提交批操作

wx.request.batch 方法的参数同 BatchRequest 类构造方法的参数

wx.request.batch 方法的示例代码如下

        await wx.request.batch((batchReq) => {
            //批请求中的请求
            数据组件.saveData({ batch: batchReq });
            服务组件.send({ batch: batchReq });
            this.request({ batch: batchReq }); 
        }, { transaction: true, page: this, concurrent: false });

请求中增加 batch 参数,传入批请求实例,相同 batch 为同一个批请求,没有 batch 参数为立即执行的请求

例如:同一批执行三个请求,分别是数据组件的保存、服务请求的发送和普通请求的发送

  • React 示例代码如下
    onJsBatchBtnClick = async (event) => {
        await wx.request.batch((batchReq) => {
            this.comp('ordermData').saveData({ batch: batchReq });
            this.comp('serviceRequest').send({ batch: batchReq });
            this.request({ url: "$serviceName/oa/person/savePerson", method: "post", batch: batchReq }); 
        }, { transaction: true, page: this, concurrent: false });
        message.info("保存成功")
    }
  • Vue 示例代码如下
    let ordermData = useData("ordermData");
    let onJsBatchBtnClick = async (event) => {
        await wx.request.batch((batchReq) => {
            ordermData.saveData({ batch: batchReq });
            $page.comp('serviceRequest').send({ batch: batchReq });
            $page.request({ url: "$serviceName/oa/person/savePerson", method: "post", batch: batchReq }); 
        }, { transaction: true, page: $page, concurrent: false });
        message.info("保存成功")
    }

案例位置

桌面-页面-数据集-前后端实现事务.w

results matching ""

    No results matching ""