循环内的函数调用在循环结束后被调用
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
是一个数组,每次调用一个条目。
注意**我将路径作为参数而不是全局变量传递
所以我使用这个 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
是一个数组,每次调用一个条目。
注意**我将路径作为参数而不是全局变量传递