1个回答
test
2024-07-08
顺序,批量,两个关键字
先说批量,如果 1000 个一批,就不存在顺序问题。既然存在顺序问题,那一批是多少个……当然作为测试题来说多少个不重要,可以假设 100 个一批,需要分 10 批。所以第一个考点是,如何分批,Lodash 的 _.chunk
就是干这个事情的。但是在这个问题上用 chunk 比较费空间,不是最优解。
然后说顺序。提交到服务器是一个异步操作,异步操作的顺序需要通过回调来保证。因为这里涉及到多次(且不定次数)提交,所以本质上是一个递归。当然如果使用 await 语法,就可以用一个简单的循环来实现。
async function submitAll(list, chunk) {
for (let i = 0; i < list.length; i += chunk) {
const subList = list.slice(i, i + chunk);
await axios.post(url, subList);
}
}
回调写法大概是这样
function submitAll(list, chunk, doneCallback) {
submit(0);
function submit(i) {
if (i >= list.length) {
doneCallback();
return;
}
const data = list.slice(i, i + chunk);
axios.post(url, data)
.then(() => submit(i + chunk));
}
}
反正用 await 肯定是简单得多,但要注意错误处理。Promise.then 方式如果出错不会中断程序,如果没有 catch() 会直接忽略错误。但是 await 方式发生错误会抛异常,必须要使用 try ... catch
语法。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容