使用计数器循环函数异步回调

时间:2017-10-30 14:58:38

标签: javascript node.js pdftotext

我有PDF并希望将每页文本提取到自己的文档中。因此1.txt包含第一页的所有文本,2.txt包含第二页的所有文本,依此类推......

然而,当它必须写入文件时,计数器i已经在页面上,我最终只将最后一页保存到文本文件中。

  let pages = 8
  for (var i = 0; i < pages; i++) {
    var option = {from: i, to: i + 1};
    pdfUtil.pdfToText(toFolder + "document.pdf", option, function(err, data) {
      if (err) throw(err);
      fs.writeFile(toFolder + (option.to) + '.txt', data, (err) => {
        console.log("file saved", option.to)
      })
    });
  }

为什么当保存时,option.to总是等于9?

我该如何防止这种情况?

2 个答案:

答案 0 :(得分:3)

将你的代码包裹在IIFE中的循环中,如下所示:

  let pages = 8
  for (var i = 0; i < pages; i++) {
    var option = {from: i, to: i + 1};
    (function(option) {
      pdfUtil.pdfToText(toFolder + "document.pdf", option, function(err, data) {
        if (err) throw(err);
        fs.writeFile(toFolder + (option.to) + '.txt', data, (err) => {
           console.log("file saved", option.to)
        })
      });
    })(option);
  }

答案 1 :(得分:0)

这是因为范围界定。 var option是一个变量,每次循环都没有创建新变量,它会更新现有变量。

首先尝试let option。如果这不起作用,请回答。 let具有块范围,这意味着每次循环都会创建一个新的option变量。