Javascript Promise 无法解析 createWriteStream

Posted

技术标签:

【中文标题】Javascript Promise 无法解析 createWriteStream【英文标题】:Javascript Promise not resolving for 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),因为它只会在您的任何事件处理程序运行之前执行 - 使它们无用。 【参考方案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

【讨论】:

以上是关于Javascript Promise 无法解析 createWriteStream的主要内容,如果未能解决你的问题,请参考以下文章

javascript 解析结果 - Promise和writeFilewith Node

javascript 解析结果 - Promise和writeFilewith Node

JavaScript 中的 Promise.all:如何获得所有承诺的解析值?

JavaScript Promise.all - 如何检查解析状态?

javascript 获取Promise *和*拒绝/解析函数指针。保存一些包装。

ES6中的Promise深入解析