问题描述
我能够在papa解析器中进行全部配置,即使解析20万个项目,它也能很好地工作。因此,我可以处理所有数据,它们等待结果数组中的每一行。问题是如果我正在使用某个步骤,如何使该步骤等待上一步?这导致解析器激发成千上万的呼叫,然后阻止了我。我试图将步骤包裹在另一个函数中,但这也无济于事。
这是我在步骤调用中所做的示例
async function stepFn(results,parser) {
stepped++;
(await (async function () {
if (results) {
if (results.data) {
rowCount += results.data.length;
console.log('checking if item exists');
var itemExistsP = await restcallToRetrieve();
if (itemExistsP.length > 0) {
console.log('Item exists,skipping');
//return;
} else {
console.log('adding item to list');
await restcalltoAdd();
// return item;
}
}
if (results.errors) {
errorCount += results.errors.length;
firstError = firstError || results.errors[0];
}
}
}()));
}
这是解析器调用:
Papa.parse($('#parse-file')[0].files[0],{
delimiter: '',header: true,dynamicTyping: false,skipEmptyLines: true,preview: 0,encoding: '',step: stepFn,worker: false,comments: '',download: false,complete: completeFn,error: errorFn,});
解决方法
只需创建一个async
stepFunction:
async function stepFn(results,parser) {
parser.pause(); // pause the parser
if (results.data) {
rowCount += results.data.length;
let itemExists = await restCallToRetrieve(/*probably the data goes here*/);
if (itemExists.length > 0) {
console.log('Item exists,skipping');
}
else {
console.log('adding item to list');
await restCallToAdd(/*probably the data goes here*/);
}
}
else if (results.errors.length > 0) { //Note that I am checking if there are errors
errorCount += results.errors.length;
firstError = results.errors[0];
}
parser.resume(); // resume the parser
}
然后在parse config object
中输入
Papa.parse(file,{
step: stepFn
});
将您等待的所有内容放在try catch
块中也很好,但这当然不重要。