在循环函数异步回调中使用计数器
Use Counter in Loop Functions Async Callback
我有一个 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?
我怎样才能避免这种情况?
这是因为范围界定。 var option
是一个单独的变量,每次循环它都不会创建新变量,而是更新现有变量。
首先尝试let option
。如果这不起作用,请回复。 let
具有块作用域,这意味着每次通过循环你都会创建一个新的 option
变量。
像这样在 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);
}
我有一个 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?
我怎样才能避免这种情况?
这是因为范围界定。 var option
是一个单独的变量,每次循环它都不会创建新变量,而是更新现有变量。
首先尝试let option
。如果这不起作用,请回复。 let
具有块作用域,这意味着每次通过循环你都会创建一个新的 option
变量。
像这样在 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);
}