爸爸解析器等待步骤

问题描述

我能够在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块中也很好,但这当然不重要。