javascript - 在采取任何行动之前如何正确等待退货?
问题描述
我正在为一些等待/异步功能而苦苦挣扎。所以我有以下功能,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);
解决方案
我看到承诺(或异步等待)配方与回调配方混合在一起。不。
- 是否
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);
- 如果
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(
等。
推荐阅读
- go - 如何在 Golang 中编写 SCSI 命令(WriteAtomic,Read16)?
- docker - 安装和配置 CI/CD 出现问题
- delphi - 在 Delphi 中销毁表单的正确方法是什么?
- java - 使用java获取一定的XML值
- c# - NLog 不打印来自 aspnet 请求标头的值
- html - 如何跟随前面的数字隐藏选项数据?
- python - Python:如何在(value_min,value_max)上绘制数据
- math - 在数学术语中使用变量自我值进行变量赋值的含义?
- maven - Maven命令在损坏时删除所有本地存储库内容
- makefile - 是否有任何软件可以自动格式化用 Makefile 编写的代码?