Javascript Обещание не разрешается для createWriteStream - PullRequest
1 голос
/ 27 февраля 2020

Я пробовал много вариантов, чтобы моя функция возвращала параметр, чтобы я мог запускать свои функции только после завершения одного шага, но в поисках лучшего способа, который не привел бы меня в ад обратного вызова.

У меня есть следующая функция

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 разрешен)

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Возможно, вы не выполнили обещания правильно,

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

Также см. Этот вопрос

0 голосов
/ 27 февраля 2020

Структура ваших Promise s не совсем верна, взгляните на мой пример:

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-file и image-second-file, и только после обоих Promise s разрешены, напечатайте response и там вы можете позвонить compareItems.

...