Node.js 将回调代码重构为异步/等待
我有一个基于node.js/express的loopback.js应用程序,带有一个PDF服务,它使用HtmlToPDF生成PDF 一些代码: 服务/pdf.js 对于不同类型的PDF,我有不同的模板。对于每种类型的不同名称、输出路径、模板等Node.js 将回调代码重构为异步/等待,node.js,async-await,loopbackjs,html-to-pdf,Node.js,Async Await,Loopbackjs,Html To Pdf,我有一个基于node.js/express的loopback.js应用程序,带有一个PDF服务,它使用HtmlToPDF生成PDF 一些代码: 服务/pdf.js 对于不同类型的PDF,我有不同的模板。对于每种类型的不同名称、输出路径、模板等 exports.invetory = function(html, cb) { exports.PDF({ html: html }, cb); } 下面是一个示例,我如何使用代码中的服务 models/inventory.js 崩溃 P
exports.invetory = function(html, cb) {
exports.PDF({
html: html
}, cb);
}
下面是一个示例,我如何使用代码中的服务
models/inventory.js
崩溃
PDF服务导入到代码中,并调用清单模板
清单模板调用PDF服务
PDF服务启动htmlToPDF实例,创建PDF并将其保存为文件。
文件从磁盘读取,API将其发回。
问题
我尝试将Inventory.pdf函数设置为异步/等待感知。但如果我这样做了
Inventory.pdf = async (id, next) => {
return await pdf.inventory('yo', next);
}
接下来,回调函数将是未定义的,这没关系,但是我应该如何更改PDF服务,使其既可以用于异步调用,也可以用于旧的回调方式。我在代码中有很多旧的模板函数。任何建议都是非常受欢迎的。async/await只适用于承诺。因此,您的库存功能需要成为一个承诺。我试图取消嵌套您的函数,希望它更易于阅读。我没有完整的代码库,但希望大家能理解我的想法。因此,可能会丢失一些VAR等
// Build HTML to PDF
exports.htmlToPDF = function() {
return new Promise(async (resolve, reject) => {
let htmlToPDFData;
try {
htmlToPDFData = await htmlToPDF.build();
} catch (err) {
reject(err);
return;
}
resolve(htmlToPDFData);
});
};
// Read data from a file
exports.sendBackFile = function(outputPath) {
return new Promise(async (resolve, reject) => {
let fileData;
try {
fileData = await fsReadFile(outputPath, "utf8");
} catch (err) {
reject(err);
return;
}
resolve(fileData);
});
};
exports.PDF = function(options) {
return new Promise(async (resolve, reject) => {
// ...
const htmlToPDF = new HTMLToPDF({
// ... options
});
let backFileData;
let htmlToPDFData;
try {
backFileData = await exports.sendBackFile(outputPath);
} catch (err) {
reject(err);
}
const contentDisposition = `attachment; filename=${filename}.pdf`;
// Assuming this function is not a promise we just call it. Originally this was one of the callback functions.
callWhateverFunctionWeNeedTo(
null,
backFileData,
"application/pdf",
contentDisposition,
"SAMEORIGIN"
);
// start / stop Xvfb code ...
try {
htmlToPDFData = await exports.htmlToPDF();
} catch (err) {
reject(err);
}
// Read the file and send it back
try {
await exports.sendBackFile(htmlToPDFData);
} catch (err) {
reject(err);
}
});
};
// Call inventory
exports.invetory = function(html) {
return new Promise(async (resolve, reject) => {
try {
await exports.PDF({ html });
} catch (err) {
reject(err);
}
resolve();
});
};
Inventory.pdf = async (id, next) => {
try {
await pdf.inventory("yo");
} catch (err) {
console.log(err);
return;
}
next();
};
您需要在if err{cberr}中有一个返回:如果err{return cberr}没有它,则回调的其余部分将运行。cb将被调用两次。
Inventory.pdf = async (id, next) => {
return await pdf.inventory('yo', next);
}
// Build HTML to PDF
exports.htmlToPDF = function() {
return new Promise(async (resolve, reject) => {
let htmlToPDFData;
try {
htmlToPDFData = await htmlToPDF.build();
} catch (err) {
reject(err);
return;
}
resolve(htmlToPDFData);
});
};
// Read data from a file
exports.sendBackFile = function(outputPath) {
return new Promise(async (resolve, reject) => {
let fileData;
try {
fileData = await fsReadFile(outputPath, "utf8");
} catch (err) {
reject(err);
return;
}
resolve(fileData);
});
};
exports.PDF = function(options) {
return new Promise(async (resolve, reject) => {
// ...
const htmlToPDF = new HTMLToPDF({
// ... options
});
let backFileData;
let htmlToPDFData;
try {
backFileData = await exports.sendBackFile(outputPath);
} catch (err) {
reject(err);
}
const contentDisposition = `attachment; filename=${filename}.pdf`;
// Assuming this function is not a promise we just call it. Originally this was one of the callback functions.
callWhateverFunctionWeNeedTo(
null,
backFileData,
"application/pdf",
contentDisposition,
"SAMEORIGIN"
);
// start / stop Xvfb code ...
try {
htmlToPDFData = await exports.htmlToPDF();
} catch (err) {
reject(err);
}
// Read the file and send it back
try {
await exports.sendBackFile(htmlToPDFData);
} catch (err) {
reject(err);
}
});
};
// Call inventory
exports.invetory = function(html) {
return new Promise(async (resolve, reject) => {
try {
await exports.PDF({ html });
} catch (err) {
reject(err);
}
resolve();
});
};
Inventory.pdf = async (id, next) => {
try {
await pdf.inventory("yo");
} catch (err) {
console.log(err);
return;
}
next();
};