Node.js 将回调代码重构为异步/等待

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

我有一个基于node.js/express的loopback.js应用程序,带有一个PDF服务,它使用HtmlToPDF生成PDF

一些代码:

服务/pdf.js

对于不同类型的PDF,我有不同的模板。对于每种类型的不同名称、输出路径、模板等

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();
};