Как правильно дождаться возврата, прежде чем предпринимать какие-либо действия?

Я борюсь с некоторыми функциями ожидания/асинхронности. Итак, у меня есть следующая функция, которая pdfData никогда не отличается от undefined; Что я хочу сделать, так это то, что после всего процесса создания файла PDF подпишите его с помощью s3, загрузите его на s3, а затем удалите из временной папки, чтобы вернуть статус и URL-адрес для загрузки.

Может ли кто-нибудь сообщить мне, что мне не хватает?

const pdfData = await pdf
  .create(content, options)
  .toFile(`./src/services/temp/${fileName}`, async function(error, result) {
    if (error) return console.info(error);

    const file = result.filename;
    // requestSignS3
    const awsSign = await signS3(
      `statements/${fileName}`,
      "application/pdf"
    );
    // upload document to S3
    const uploadStatus = await uploadDocumentToS3(awsSign, file);
    // delete file from temp folder
    fs.unlink(file, err => {
      if (err) throw err;
    });
    // set data to return
    const data = {
      status: uploadStatus,
      url: awsSign.url
    };

    return data;
  });

console.info(pdfData);

Просто вопрос проверки работоспособности ... ваш await pdf ... внутри асинхронной функции?

An0nC0d3r 09.04.2019 13:21

да, вся эта функция внутри try catch

Markus Hayner 09.04.2019 13:24

?? Try/catch не является асинхронной функцией

An0nC0d3r 09.04.2019 13:29

Да, извините, попытка catch завернута в асинхронную функцию.

Markus Hayner 09.04.2019 13:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу рецепт обещания (или асинхронного ожидания), смешанный с рецептом обратного вызова. Не надо.

  1. toFile возвращает обещание? Если это так, то мы почти уже там:
const pdfFile = await pdf
  .create(content, options)
  .toFile(`./src/services/temp/${fileName}`);

const pdfData = await /* everything async you want to do with pdfFile goes there */(pdfFile);
  1. Если toFile не возвращает промис, вам нужно промисифицировать его либо с помощью библиотеки promisify, либо вручную. В основном это будет выглядеть так:
const toFilePromise = new Promise(function(reject, resolve) => {
    pdf.create(content, options)
        .toFile(`./src/services/temp/${fileName}`, function(error, result) {
            if (error) {
                reject(error);
            } else {
                resolve(result);
            }
        })
});

Теперь toFilePromise — это то, чего можно ожидать. После этого вы можете извлечь имя файла, await signS3( и т. д.

поэтому я использую html-pdf для рендеринга руля в pdf и .toFile я вижу, что это занимает два параметра export interface CreateResult { toBuffer(callback: (err: Error, buffer: Buffer) => void): void; toFile(callback: (err: Error, res: FileInfo) => void): void; toFile(filename?: string, callback?: (err: Error, res: FileInfo) => void): void; toStream(callback: (err: Error, stream: fs.ReadStream) => void): void; }

Markus Hayner 09.04.2019 13:57

Отредактировано с более подробной информацией.

mbojko 09.04.2019 14:11

Другие вопросы по теме