如何采取适当的措施等待退货?

时间:2019-04-09 11:16:59

标签: javascript

我正在使用一些等待/异步功能。因此,我具有以下功能,pdfDataundefined永无不同;我想做的是,在创建pdf文件的所有过程之后,用s3对其进行签名,然后将其上传到s3,然后将其从temp文件夹中删除,以返回状态和要下载的网址。

有人可以让我知道我在想什么吗?

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

1 个答案:

答案 0 :(得分:1)

我看到Promise(或async-await)配方与回调配方混合在一起。不要。

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