【问题标题】:Javascript Promise not resolving for createWriteStreamJavascript Promise 无法解析 createWriteStream
【发布时间】:2020-06-11 03:27:20
【问题描述】:

我尝试了许多变体,让我的函数返回一个参数,这样我就可以只在一个步骤完成时运行我的函数,但寻找不会让我陷入回调地狱的最佳方法。

我有以下功能

function convertPdfToImage(fileName) {

  return new Promise((resolve, reject) => {
    var pdfImage = new PDFImage(fileName+".pdf");

    pdfImage.convertFile().then(function (imagePaths) {
      var file = fs.createWriteStream(imagePaths);
      file.end();
      file.on("finish", () => { resolve(true); });
      file.on("error", reject);
      return resolve(true)
    });
  });
}

我在这里这样称呼:

Promise.all([convertPdfToImage('test2'), convertPdfToImage('test1')])})
    .then(function () {
      compareItems(codeId);
    });

这是PromiseAll中调用的方法

function convertPdfToImage(env: string, shareClassId: string[]) {

  return new Promise((resolve, reject) => {
    var pdfImage = new PDFImage("output/" + shareClassId + env + ".pdf");

    pdfImage.convertFile().then(function (imagePaths) {
      var file = fs.createWriteStream(imagePaths);
      file.end();
      file.on("finish", () => { resolve(true); });
      file.on("error", reject);
      return resolve(true)
    });
  });
}

无论我尝试什么问题,我都无法保证 compareItems 在 convertPdfToImage 之后运行(PromiseAll 已解决)

【问题讨论】:

  • 删除return resolve(true)。否则你解决两次。
  • 谢谢。试过了,但仍然没有。我只是为了确保它能够解决。事实上,如果没有第二次解决,它根本不会解决
  • 您是否尝试过捕获并记录可能的错误?
  • 为什么在向流中写入任何内容之前以及在流上安装任何事件处理程序之前调用file.end()。这两个似乎都错了。当然,您应该在开始写入流之前和调用file.end() 之前安装您的事件处理程序。而且,您必须删除return resolve(true),因为它只会在您的任何事件处理程序运行之前执行 - 使它们无用。

标签: javascript typescript promise es6-promise createwritestream


【解决方案1】:

你的Promises 的结构并不正确,看看我的例子:

const fs = require("fs");

class PDFImage {
  constructor(filename) {
    this.filename = filename;
  }
  convertFile() {
    return new Promise((resolve, reject) => {
      resolve(`image-${this.filename}`);
    });
  }
}

function convertPdfToImage(fileName) {

  return new Promise((resolve, reject) => {

    new PDFImage(fileName).convertFile().then(imageFileName => {

      const file = fs.createWriteStream(imageFileName);
      file.end();

      file.on("error", (error) => {
        reject(error);
      });

      file.on("finish", () => {
        resolve(true)
      });
    });
  });
}

Promise.all([
  convertPdfToImage("first-file"),
  convertPdfToImage("second-file")
]).then(response => {
  console.log(response);
  console.log("files created, can be compared now.");
})

此代码将创建文件image-first-fileimage-second-file,并且只有在Promises 都解决后,打印response 并在那里您可以调用compareItems

【讨论】:

  • PDFImage 是我正在导入的一个 npm 包: var PDFImage = require("pdf-image").PDFImage
  • 我明白这一点,但我认为这不会影响答案。我只需要知道PDFImage.convertFile 返回一个Promise
【解决方案2】:

你可能没有正确实现承诺,

function convertPdfToImage(fileName) {
  let pdfImage = new PDFImage(fileName+".pdf");
  return pdfImage.convertFile().then(function (imagePaths) {
    let file = fs.createWriteStream(imagePaths);
      file.end();
      file.on("finish", () => { resolve(true); });
      file.on("error", reject);
      return true 
  }).catch(err){
    console.log(err);
  }
} 

另外,使用 async/await,

async function convertPdfToImage(fileName) {
  let pdfImage = new PDFImage(fileName+".pdf");
  try{
    const imagePaths = await pdfImage.convertFile();
    let file = fs.createWriteStream(imagePaths);
    file.end();
    file.on("finish", () => { resolve(true); });
    file.on("error", reject);
    return true 
  } catch(err){
    console.log(err);
  }
} 

另外,请参阅question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 2019-09-12
    • 2020-06-27
    • 1970-01-01
    • 2015-08-15
    • 2017-07-27
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多