3 个回答

顺序,批量,两个关键字

先说批量,如果 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 语法。

考你 javascript 的同步异步呢

去看 javascript 关于 异步,回调,async await 等内容

大概是这么个意思,你可试试去掉 async 和await 看看服务器哪边有什么区别

 async function post(){
       
        for (let i = 0; i < 10000; i++) {
            
            let rep = await axios.post('http://127.0.0.1:8081',{i})
            console.log(rep)
        }
        console.log('done')
    }
    post()

demo已奉上,在ajax回调里递归调用就行了,每次传递的数据用solice方法去拿

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏