【问题标题】:await not efficient in asynchronous functionawait 在异步函数中效率不高
【发布时间】:2020-07-07 04:15:27
【问题描述】:

我正在尝试异步解析 pdf 数据,然后用 pdf 文件的内容填充一个 JS 对象,然后在 Promise 中返回它。 我正在使用“pdfreader”模块及其方法 parseFileItems()

async function parsePdfDatas(filePath){

  var output = {};
  var reader = new pdfreader.PdfReader();

  await reader.parseFileItems(filePath, function(err, item) {

    // item treatment populating output Object
  });

  return output;

}

parsePdfDatas("./****.pdf").then( function(output) {
  console.log(output);
});

等待语句不起作用,有人知道吗? 编辑 在 xMayank 回答之后,我尝试了以下方法,这也不起作用:

const fs = require('fs');
var pdfreader = require("pdfreader");

var row = {
  id: "",
  muban: "",
  get mID() {
    this.id.slice(6,8);
  },
  tambon: "",
  get tID() {
    this.id.slice(4,6);
  },
  amphoe: "",
  get aID() {
    this.id.slice(2,4);
  },
  changwat: "",
  get cID() {
    this.id.slice(0,2);
  }
}

function parsePdfDatas(filePath){

  return new Promise(function(resolve, reject){

    var output = {};
    var reader = new pdfreader.PdfReader();

    reader.parseFileItems(filePath, function(err, item) {

        if(item && item.text && item.text.match(/^-{1,3}[0-9]{1,4}-{1,3}$/) === null && item.y != 2.887){

            if(item.x === 2.388){

                // If the row object contains a muban entry, we push it at the end of output
                if(row.id !== ""){

                    //console.log(row);
                    output[row.id] = {mName : row.muban, tName : row.tambon, aName : row.amphoe, cName : row.changwat};

                }

                // new line, row object reinitialization
                row.id = row.muban = row.tambon = row.amphoe = row.changwat = "";

            }

            // correction for ่ ้
            if(item.R[0].T === "%E0%B8%BD") item.text = "่";
            if(item.R[0].T === "%E0%B8%BE") item.text = "้";

            if(item.x >= 2.388 && item.x < 11.303)
                row.id += item.text;
            else if(item.x >= 11.303 && item.x < 17.969)
                row.muban += item.text;
            else if(item.x >= 17.969 && item.x < 23.782)
                row.tambon += item.text;
            else if(item.x >= 23.782 && item.x < 29.698)
                row.amphoe += item.text;
            else if(item.x >= 29.698)
                row.changwat += item.text;

            console.log(item.R[0].T + " -> " + item.text);
            //console.log(item.text + " : x = " + item.x + " | y = " + item.y);

        }
        
    });

    resolve(output);

  });

}

parsePdfDatas("./files/mubans0.pdf").then((output) => {
  console.log(output);
});

【问题讨论】:

  • await 等待承诺解决...reader.parseFileItems 不返回承诺
  • parseFileItems 是否返回 Promise?
  • 将 return 语句放在 parseFileItems 的 callbak 中并删除 await 应该可以。
  • 查看发布的代码链接,因为reader.parseFileItems 的回调可以被多次调用,你需要想一个不同的方法来实现你想要的,因为没有明显的迹象通话完成的时间——即使是“裸露的”Promise 也无济于事

标签: javascript node.js asynchronous async-await


【解决方案1】:

工作正常。

const { PdfReader } = require("pdfreader");

function readFile(file){
  return new Promise(function(resolve, reject){
    new PdfReader().parseFileItems(file, function(err, item) {
      if (err) reject(err);
      else if (!item) resolve();
      else if (item.text) resolve(item.text);
    });
  })

}

readFile("./****.pdf")
  .then(result =>{
    console.log("Here", result)
  })

【讨论】:

  • 如果你有多个文件,这只会返回第一个解析的文件
  • 不,这对多个文件有效。函数每次都在解析。
  • 你不能多次解决一个promise ...但是回调可以被多次调用(对于它找到的每个项目)......最后调用的回调是一个空的项目?
  • parseFileItems() 解析 pdf 的每个字符。我想处理每个字符并在 parseFileItems 完成后返回一个对象。我确实编辑了我的问题以向您展示我尝试过的方法,但它不起作用。
  • xMayank - 您的答案仅适用于 pdf 的第一个字符,我对如何将这些异步函数与 parseFileItems() 方法的循环结合起来感到困惑。
猜你喜欢
  • 1970-01-01
  • 2022-06-18
  • 2020-09-07
  • 2019-09-12
  • 1970-01-01
  • 2020-12-23
  • 2020-08-13
  • 2020-04-15
  • 2019-06-14
相关资源
最近更新 更多