首页 > 解决方案 > 在采取任何行动之前如何正确等待退货?

问题描述

我正在为一些等待/异步功能而苦苦挣扎。所以我有以下功能,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.log(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.log(pdfData);

标签: javascript

解决方案


我看到承诺(或异步等待)配方与回调配方混合在一起。不。

  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(等。


推荐阅读