循环内的函数调用在循环结束后被调用

Function call inside loop gets called after the loop ends

所以我使用这个 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,输出显示 test2.docx 的 conv() 被调用了 2 次,而不是每个文件调用一次。我该怎么办?

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

conv(final_path)

并且:

function conv(path) {
  convertapi.convert('pdf', { File: path })
  ...

所以你在连续调用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);

results是一个数组,每次调用一个条目。

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