解决useEffect调接口重复请求的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决useEffect调接口重复请求的问题相关的知识,希望对你有一定的参考价值。

参考技术A useEffect的执行机制,是比较两次依赖项是否相同,不同则执行相关effect。

思路1: 查看父组建有没有多次UseState,每useSTate一次,子组件就会render一次,导致多次执行useEffect调接口
思路2: useEffect 的依赖项有多个的时候,尽量简洁 。某些执行效果一样的依赖项目就保留一个。

如果想先调父组件数据,再调子组件数据,可以把父组件的请求结果数据,作为子组件的依赖项。

useLayoutEffect的执行顺序是同步,useEffect是异步的。useLayoutEffect会优先于useEffect执行。

关于接口并发问题,webservice,等http请求

暂且不谈高并发 只谈并发  .

不想丢请求再去考虑高并发 MQ或redis的事(这里不考虑)

正题.记录自我需求处理并的情况.

公司的一个框架(一种商业框架很庞大)无法使用整合市面上那些较新的技术框架,只能使用基础的java工具

这里的接口是一个模块 是webservice的

外部系统调用这个接口 重复写入 数据出现重复单据.故对此问题进行解决.

分析:

1.外部系统短时多次提交重复数据 

2.接口系统业务复杂 处理数据用时过长,导致数据积压 .数据脏读.

/**
 * 产成品入库单
 * @author Administrator
 *
 */
public class GetIcFinprodin 
	
	
	private static final Integer JP = 127;//同步对象标识

	public String getExecute(String operation,String orderform)
		String resultstr=null; 
		if (operation.equals("Insert"))
			//插入
			resultstr = insert(operation, orderform);
			
		
		
		return resultstr;
	
	
	/**
	 * 插入 
	 * @param operation
	 * @param orderform
	 * @return
	 */
	public String insert(String operation,String orderform)
		


		Boolean flag = true;//默认通过
		
		
		synchronized(JP) 
			
			//通过mes单据号查询单据是否存在 不存在就可以插入否则返回已插入提示
			if(StringUtils.isNotBlank(vdef1) )
				try 
					BaseDAO bd = new BaseDAO();
					String vbillcodeExist = (String)bd.executeQuery("select vbillcode from ic_finprodin_h where vdef1 = '"+vdef1+"'", new ColumnProcessor());
					if(StringUtils.isNotBlank(vbillcodeExist))
						flag = false;//已存在不允许重复插入
					
				 catch (DAOException e) 
					e.printStackTrace();
				
			
			
		
		
			if(flag)
                //业务===========....耗时代码段   S
				GetXChangeService gtxchangeservice=new GetXChangeService();
				
				Object ovbillcode = "";
				
				JSONObject backinfojson=gtxchangeservice.getXChangeservice(xml_sb.toString());
				if(backinfojson.getString("$successful").equals("Y"))
					String pk=backinfojson.getJSONObject("sendresult").getString("content");
					BaseDAO bd = new BaseDAO();
					try 
						//获取插入的订单单号  
						ovbillcode = bd.executeQuery("select vbillcode from ic_finprodin_h where cgeneralhid ='"+pk+"'", new ColumnProcessor());
						
						backinfojson.put("$vbillcode", ovbillcode);
					 catch (Exception e) 
						e.printStackTrace();
					
				//业务.-===========...耗时代码段    E	
					
				else if(backinfojson.getString("$successful").equals("N")) 
					backinfojson.put("$vbillcode",ovbillcode);
					
				
				
				return backinfojson.toJSONString();
			else
				JSONObject backinfojson = new JSONObject();
				backinfojson.put("$successful", "Y");
				backinfojson.put("sendresult", vdef1+" MES单据已存在,单据已插入成功!");
				return backinfojson.toJSONString();
				
		
	
	
   

JP 标识使用  基本类型 或String 类型(注意不能new  这里是java基础的东西,可了解一下 )  作为同一对象   保证线程同步 有兴趣的可以把 127 改成128 试试效果 估计你能找到答案

同步之后性能会下降,做个取舍吧.

以上是关于解决useEffect调接口重复请求的问题的主要内容,如果未能解决你的问题,请参考以下文章

React hooks解决搜索时序问题(竞态)

在异步函数中正确使用 useEffect 和 useState [重复]

如何设计API接口,请求接口时需要进行身份验证,防止第三方随意调用接口?

如何在useEffect中使用axios请求测试反应组件?

react组件初始化接口请求有多个异步依赖参数

React Native useEffect 在异步函数中的用法[重复]