append()加载顺序调用多接口

博客主要讲述将接口A的HTML内容添加到接口B内容中时,可能出现添加不到指定位置的问题,原因是异步加载。解决办法是将接口A的内容放在接口B内容加载完之后再调用,避免添加失败。

遇到的问题:
有两个接口分别为A和B ,要将A里的html append() 到 B当中的append()的内容中,可能出现的问题就是 A中的内容添加不到B中的位置去,所以要考虑异步加载的问题

A接口内容如下:
将图片放到页脚

function getfooterads(){
	let para = {
		"ppkid":ppkid,
		"schid":schid
	}
	getfooterad(para).then((res) => {
		if(res.code == 1){
			var facontent = res.data.facontent;
			var advhtml = '<div class="adv"><img src="'+facontent+'" width="100%"/><div>';
			// 将 advhtml 内容 放到$('[data-role="tablebox"]')大盒子中 $('[data-role="advhtml"]')中,
			// $('[data-role="tablebox"]')是异步加载来的盒子
			$('[data-role="tablebox"]').find('[data-role="advhtml"]').html(advhtml);
		}
	})
}
getfooterads();

所以,需要将接口A的内容要放在B接口 append()内容加载完之后,再调用
写法如下:

function getlevelreports(){
	let para = {
		"ppkid":ppkid,
		"schid":schid
	}
	getlevelreport(para).then((res) => {
		if(res.code == 1){
			var levelreport = res.data.levelreport;
			var userpaper = res.data.userpaper;
			var schoollogo = levelreport.schoollogo;
			var schoolshortname = levelreport.schoolshortname;
			if(userpaper.length > 0){ //判断是否有好友,有好友才显示
				var tablehtmltop = '';
				var tablehtmlbtm = '';
				tablehtmltop = '<table width="100%" class="table" id="tablevalue">'+
								  '<thead>'+
								   '<tr>'+
										'<th width="12%">排名</th>'+
										'<th width="42%">好友</th>'+
										'<th width="18%">答题时长</th>'+
										'<th width="13%">得分</th>'+
										'<th width="15%">总排行</th>'+
									'</tr>'+
									'</thead>'+
									'<tbody data-role="tbody">';
				tablehtmlbtm = '</tbody></table><div style="margin:2rem 0 6rem;">'+
								'<div data-role="advhtml"></div>'+  //添加广告的盒子
								'<div><img src="'+schoollogo+'" class="fl"/>'+
								'<span class="fl">'+schoolshortname+'出品</span></div></div>';		
								
				$('[data-role="tablebox"]').append(tablehtmltop + tablehtmlbtm);
				
				getfooterads();//添加广告调用方法
			}else{
				$('[data-role="tablebox"]').append('<p>快去分享给好友一起PK吧</p>');
			}
		}
	})
}

$('[data-role="tablebox"]').append(tablehtmltop + tablehtmlbtm);之后调用 getfooterads();//添加广告
这样就不会加不进去了。

<think>好的,我现在需要解决用户在wangeditor中上传多张图片时顺序错乱的问题。首先,我需要理解用户的具体情况。用户在上传多张图片时,图片的顺序和实际选择的顺序不一致,这可能是因为上传是异步的,导致返回的顺序无法保证。接下来,我需要回忆一下wangeditor的相关知识,以及常见的解决方案。 首先,wangeditor是一个基于JavaScript的富文本编辑器,支持图片上传功能。当用户选择多张图片后,通常会通过异步请求逐个上传图片到服务器。由于网络请求的异步性质,每个上传完成的顺序可能和用户选择的顺序不一致,导致最终插入到编辑器中的图片顺序错乱。 接下来,我需要考虑如何确保图片上传后的顺序与用户选择的顺序一致。常见的解决方案可能有以下几种: 1. **前端控制上传顺序**:通过在前端按顺序逐个上传图片,而不是同时发起多个请求。这样即使每个上传是异步的,也可以保证完成的顺序与选择顺序一致。具体来说,可以先将所有选中的图片存储在一个数组中,然后递归或使用循环逐个上传,等待上一个上传完成后再处理下一个。 2. **在服务器端添加时间戳或序号**:用户上传时,前端可以为每个图片添加一个序号或时间戳,服务器端根据这个信息对图片进行排序。这种方法需要前后端配合,确保每个图片的序号正确传递并在保存时记录。 3. **使用Promise.all或类似机制**:如果同时上传多个图片,可以使用Promise.all来等待所有上传完成,然后根据返回的顺序重新排序。不过,这可能不可靠,因为Promise.all的结果顺序取决于各个Promise完成的顺序,而不是调用的顺序。 现在需要分析哪种方法最适合用户的场景。根据用户的问题,他们可能没有修改服务器端的能力,或者希望仅通过前端解决。因此,前端控制上传顺序可能是更可行的方案。 接下来,我需要查阅wangeditor的文档,确认其上传接口是否支持自定义的上传函数,是否允许控制上传的顺序。通常,wangeditor允许自定义上传方法,可以通过配置`customUpload`或类似的选项来实现。 假设用户可以自定义上传函数,那么可以将选中的图片按顺序逐个上传。例如,用户选择多个文件后,将这些文件存储在一个队列中,然后逐个处理,每个上传完成后再处理下一个。这样可以确保上传完成的顺序与选择顺序一致。 此外,还需要注意wangeditor插入图片到编辑器中的方式。每上传完成一个图片,就将对应的图片URL插入到编辑器中,这样可以保持顺序。但如果多个上传同时进行,完成的顺序可能打乱,导致插入顺序错乱。 因此,具体的实现步骤可能如下: 1. 在自定义上传函数中,将用户选中的文件列表转换为数组,并按原始顺序存储。 2. 逐个上传每个文件,等待前一个上传完成后再开始下一个。 3. 每上传成功一个,就将图片插入到编辑器的当前光标位置。 4. 如果某个上传失败,需要处理错误,并继续上传后续的图片。 接下来,需要编写示例代码来演示这个过程。例如,在wangeditor的配置中,设置`customUpload`方法,将文件列表保存到数组,然后使用递归或async/await逐个处理。 还需要考虑用户可能遇到的错误,例如上传失败的处理,以及如何保持编辑器的状态。例如,使用async/await可以更清晰地控制流程,避免回调地狱。 此外,如果用户需要显示上传进度或状态,可能需要在前端添加相应的UI反馈,但这可能超出了当前问题的范围。 最后,需要验证这个解决方案是否有效。例如,模拟上传多个图片,观察插入顺序是否与选择顺序一致。如果发现顺序正确,则解决方案有效;否则需要进一步调整。 总结可能的步骤后,我需要将这些整理成用户容易理解的回答,分点说明解决方案,并提供代码示例。同时,根据用户提供的引用内容,虽然引用可能与当前问题无关,但需要注意是否有相关的信息可以利用,但在此例中可能不需要。</think>针对wangeditor多图上传顺序错乱问题,以下是分步解决方案: ### 原因分析 异步并发上传导致图片返回顺序不可控,编辑器按接口响应顺序插入图片[^1] ### 解决方案 #### 方法一:顺序上传控制 1. 将文件列表转为数组 2. 逐个串行上传文件 3. 按原始顺序插入编辑器 ```javascript const editor = new E('#editor') editor.config.customUpload = async (files, insertImgFn) => { const uploadQueue = Array.from(files) const sequentialUpload = async (index) => { if(index >= uploadQueue.length) return const file = uploadQueue[index] const formData = new FormData() formData.append('file', file) try { const res = await axios.post('/upload', formData) insertImgFn(res.url) // 按原始顺序插入 await sequentialUpload(index + 1) } catch (error) { console.error(`第${index+1}张图片上传失败`, error) await sequentialUpload(index + 1) // 失败后继续上传后续 } } await sequentialUpload(0) } ``` #### 方法二:服务端排序 1. 前端添加顺序标识 ```javascript formData.append('index', index) // 添加顺序标识 ``` 2. 服务端返回排序后的URL列表 3. 统一插入编辑器 ### 注意事项 1. 保持编辑器焦点不变 2. 添加加载状态提示 3. 处理失败图片的占位提示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值