如何确保一个函数调用的回调仅在第二个函数调用的回调后执行
how to make sure callback of one function call, gets executed only after callback of the second function call
我正在尝试使用 javascript 解析包含 table 形式数据的 pdf。我的 pdf 文件是大学时间 table 的网格形式,每个网格中都有数据。
我正在使用 pdfreader npm 包(我对 javascript 很陌生,所以我不确定是否有更好的包用于该用例)
我的计划是首先通过 pdf 进行解析,并借助我知道及时出现的几个词 table(例如日期名称)并获取网格中的近似 x 和 y 坐标PDF。其次,再次解析 pdf,现在从文本中,我借助第一次获取的坐标填充了一些二维数组。
在 pdf 解析器示例中,有一个函数 parseFileItems,它在从 pdf 文件解析的每个项目上调用 itemHandler(error, item)。因此,对于第一遍,我将函数称为
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
if (err) console.error("error:", err);
else if (!item) console.warn("end of file");
else if (item.text) {
cordinatesofGrid=//my logic to fetch the cordinates of the grid
}
});
现在我需要做的是再次解析 pdf 并利用我在第一遍中获取的“corordinatesofGrid”变量。所以我再次打算第二次调用 parseFileItems。但这应该只发生在第一遍及其回调代码执行完毕后。
我尝试用 await 调用第一个 parseFileItems,然后第二次调用 parse 函数,但这没有按预期工作。 (我假设这是因为等待不适用于回调)
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//first call
});
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//second call
});
谁能建议如何确保第一个函数调用的回调仅在第二个函数调用的回调后执行
您可以尝试使用 .then()
函数来处理承诺。
这里是 LINK 一些关于如何 works/how 使用它的文档。我相信这只有在您的函数使用 promises 时才有效(自从您尝试等待以来我就假设了)。
您可以围绕新的 PdfReader() 创建一个 Promise 包装器
快速参考我不知道 pdf 库是否基于 promise!这是来自您提供的信息!
//This code will always resolve and never throw a reject
const PdfReaderAsync = () => {
return new Promise((res, rej) => {
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
if (err || !item) rej(err)
res(item)
})
})
}
//Make the function you are calling this code async
//So you can use it like this
try {
let item = await PdfReaderAsync()
// Run through your code
} catch (err) {
//handleError
}
// Code 2
try {
let item = await PdfReaderAsync()
// Run through your code
} catch (err) {
//handleError
}
您可以将第二个放在第一个回调中并使用 await
await new PdfReader().parseFileItems("./timetable.pdf", async(err, item) => {
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//second call
});
//first call
});
我正在尝试使用 javascript 解析包含 table 形式数据的 pdf。我的 pdf 文件是大学时间 table 的网格形式,每个网格中都有数据。 我正在使用 pdfreader npm 包(我对 javascript 很陌生,所以我不确定是否有更好的包用于该用例)
我的计划是首先通过 pdf 进行解析,并借助我知道及时出现的几个词 table(例如日期名称)并获取网格中的近似 x 和 y 坐标PDF。其次,再次解析 pdf,现在从文本中,我借助第一次获取的坐标填充了一些二维数组。
在 pdf 解析器示例中,有一个函数 parseFileItems,它在从 pdf 文件解析的每个项目上调用 itemHandler(error, item)。因此,对于第一遍,我将函数称为
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
if (err) console.error("error:", err);
else if (!item) console.warn("end of file");
else if (item.text) {
cordinatesofGrid=//my logic to fetch the cordinates of the grid
}
});
现在我需要做的是再次解析 pdf 并利用我在第一遍中获取的“corordinatesofGrid”变量。所以我再次打算第二次调用 parseFileItems。但这应该只发生在第一遍及其回调代码执行完毕后。
我尝试用 await 调用第一个 parseFileItems,然后第二次调用 parse 函数,但这没有按预期工作。 (我假设这是因为等待不适用于回调)
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//first call
});
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//second call
});
谁能建议如何确保第一个函数调用的回调仅在第二个函数调用的回调后执行
您可以尝试使用 .then()
函数来处理承诺。
这里是 LINK 一些关于如何 works/how 使用它的文档。我相信这只有在您的函数使用 promises 时才有效(自从您尝试等待以来我就假设了)。
您可以围绕新的 PdfReader() 创建一个 Promise 包装器
快速参考我不知道 pdf 库是否基于 promise!这是来自您提供的信息!
//This code will always resolve and never throw a reject
const PdfReaderAsync = () => {
return new Promise((res, rej) => {
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
if (err || !item) rej(err)
res(item)
})
})
}
//Make the function you are calling this code async
//So you can use it like this
try {
let item = await PdfReaderAsync()
// Run through your code
} catch (err) {
//handleError
}
// Code 2
try {
let item = await PdfReaderAsync()
// Run through your code
} catch (err) {
//handleError
}
您可以将第二个放在第一个回调中并使用 await
await new PdfReader().parseFileItems("./timetable.pdf", async(err, item) => {
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//second call
});
//first call
});