0

所以我使用这个 API 来帮助我将 .docx 文件转换为 .pdf。我放置了将文件转换为函数的代码。:

function conv(){
 convertapi.convert('pdf', { File: final_path })
.then(function(result) {
  // get converted file url
  

  console.log("Converted file url: " + result.file.url);

  
  finp = path + file_name.slice(0, file_name.length - 5) + ".pdf";
  console.log(finp);

  // save to file
  return result.file.save(finp);
})
.then(function(file) {
  console.log("File saved: " + file);
  process.exit(1);
})
.catch(function(e) {
  console.log("numele si/sau extensia fisierului sunt gresite");

  process.exit(1);
});
}

上面的代码一次只适用于一个文件。我创建了一个循环,遍历文件夹中的每个文件(.docx)并将其名称保存到一个数组中。我遍历数组的每一项并调用函数:

for(var j = 0; j<=i ; j++){
  file_name = toate_nume[j];
  final_path = path + file_name;
  conv();
}

文件名存储正确,但是当我运行我的项目时,在循环本身结束后调用该函数(每个文件调用正确的次数)。因此,如果我有 2 个文件:test1.docx 和 test2.docx,则输出显示 conv() 为 test2.docx 调用了 2 次,而不是每个文件调用一次。我应该怎么办?

4

2 回答 2

0

原因可能是这样的:API 很慢,因此您的程序执行循环的速度比处理请求的 API 快。所以最终发生的是你在被调用final_path之前修改了变量两次convertapi,然后它被调用了两次相同的final_path. 尝试修改您的conv函数,使其接受一个参数,例如path并使用它。然后conv使用当前final_path参数调用:

conv(final_path)

和:

function conv(path) {
  convertapi.convert('pdf', { File: path })
  ...
于 2021-03-02T12:36:58.533 回答
0

因此,您正在连续调用 n Promise。你想等待结束吗?

您可以使用 Promise. all

const toate_nume = ['fileName1', 'fileName2'];
const spawn = toate_nume.map(x => {
  const final_path = path + x;
  return conv(final_path);
});
Promise.all(spawn).then(results => {
  console.log('All operation done successfully %o', results);
});

或使用await

const results = await Promise.all(spawn);

theresults是一个数组,每个调用的一个条目。

注意**我将路径作为参数而不是全局变量传递

于 2021-03-02T13:30:52.750 回答