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

Javascript 在循环函数异步回调中使用计数器,javascript,node.js,pdftotext,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",

我有一个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)
      })
    });
  }
let pages=8
对于(变量i=0;i{
console.log(“文件已保存”,选项.to)
})
});
}
为什么在节省时间时option.to总是等于9


我怎样才能防止这种情况发生?

这是因为范围限制
var选项
是一个单一变量,每次通过循环它都不会生成新变量,而是更新现有变量


首先尝试使用
let选项
。如果这不起作用,请回答
let
具有块作用域,这意味着每次通过循环时,您都要创建一个新的
选项
变量。

这是因为作用域
var选项
是一个单一变量,每次通过循环它都不会生成新变量,而是更新现有变量


首先尝试使用
let选项
。如果这不起作用,请回答<代码>让具有块作用域,这意味着每次通过循环时,您都要创建一个新的
选项
变量

  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);
  }
let pages=8
对于(变量i=0;i{
console.log(“文件已保存”,选项.to)
})
});
})(可选);
}

将您的代码包装在生活中的循环中,如下所示:

  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);
  }
let pages=8
对于(变量i=0;i{
console.log(“文件已保存”,选项.to)
})
});
})(可选);
}

您能解释一下您的解决方案吗?为什么我们需要在IIFE中包装这一部分?在js中处理异步时,需要注意在回调函数中传递的内容。在这种情况下,对象
选项
创建一次,并在每次迭代中分配新值。回调中的
option
只是对
options
内部循环的引用。因此,您需要为每个回调函数克隆该
选项。最简单的方法就是生活。你可以在这里了解更多:你能解释一下你的解决方案吗?为什么我们需要在IIFE中包装这一部分?在js中处理异步时,需要注意在回调函数中传递的内容。在这种情况下,对象
选项
创建一次,并在每次迭代中分配新值。回调中的
option
只是对
options
内部循环的引用。因此,您需要为每个回调函数克隆该
选项。最简单的方法就是生活。您可以在这里了解更多信息:这并不是问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-它从字面上回答了问题的各个方面。它展示了如何避免问题——使用
let
避免问题——并解释了问题的原因@尼日利亚人不应该是一系列的“尝试这个”,然后是那个,如果它不起作用,“回答回来”。如果您对他们需要检查的内容有一些建议,则应将其作为评论而不是答案。这并不提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-它从字面上回答了问题的各个方面。它展示了如何避免问题——使用
let
避免问题——并解释了问题的原因@尼日利亚人不应该是一系列的“尝试这个”,然后是那个,如果它不起作用,“回答回来”。如果您对他们需要检查的内容有一些建议,应该将其作为评论而不是答案。