Papa.parse中step函数遇延迟未按预期逐行执行问题排查
Papa.parse step函数并发执行的原因及解决办法
你的代码
Papa.parse(my_local_file, { step: async function(row, parser){ console.log('starting wait'); await new Promise(res => {setTimeout(() => {res(7)}, 10000)}); console.log('Row -> ' + row.data); }, complete: function (){ console.log('complete'); } });
原因解析
- Papa.parse 默认会同步快速遍历所有行,每一行都会立刻触发
step函数,不会等待step内的异步操作完成。你的step是异步函数,调用后会因await挂起,所以会一次性打印10次starting wait。 - 所有
step里的定时器是同时启动的,10秒后全部到期,因此会批量输出所有行数据。 complete函数的触发时机是Papa完成所有行的遍历调用后,和step内的异步操作无关,所以会在starting wait全部打印后立刻输出complete。
解决办法
要实现每行间隔10秒处理的效果,需要手动暂停解析流程,等当前行异步操作完成后再继续,利用parser.pause()和parser.resume()即可:
Papa.parse(my_local_file, { step: async function(row, parser){ parser.pause(); // 暂停解析,阻止立刻处理下一行 console.log('starting wait'); await new Promise(res => {setTimeout(() => {res(7)}, 10000)}); console.log('Row -> ' + row.data); parser.resume(); // 恢复解析,处理下一行 }, complete: function (){ console.log('complete'); } });
内容的提问来源于stack exchange,提问作者machupiccu
相关产品推荐
相关产品推荐

