作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 NodeJS 将许多文件写入 AWS S3。我在一个 stringifed 变量中有数据,但也测试了在文件中的读取。文件成功写入 S3,因此它确实可以工作,但“await Promise.all()”在文件上传完成之前完成。我需要知道文件何时完成上传。
// Stream File Data to S3
const data = "blah blah blah"
const s3Path = "my_path"
const promises = []
promises.push(uploadFile(data, `${s3Path}/1111.xml`))
promises.push(uploadFile(data, `${s3Path}/2222.xml`))
promises.push(uploadFile(data, `${s3Path}/3333.xml`))
promises.push(uploadFile(data, `${s3Path}/4444.xml`))
const completed = await Promise.all(promises)
下面是我用来上传文件的函数。
const uploadFile = (data, key) => {
// const fileContent = data
const fileContent = fs.readFileSync("/full_path/test.xml")
// Setting up S3 upload parameters
const params = {
"Bucket": "my_bucket",
"Key": key,
"ContentType": "application/xml",
"Body": fileContent
}
// Uploading files to the bucket
s3.upload(params, (err, data2) => {
if (err) {
throw err
}
console.log(`File uploaded successfully. ${data2.Location}`)
return true
})
}
有没有办法更新这个,让 promise.all() 在继续之前等待所有上传完成?
谢谢
最佳答案
那是因为 uploadFile()
没有返回 promise 。而且,Promise.all()
只有在您向它传递一组与其异步操作相关联的 promise 时才会做一些有用的事情。
我怀疑 s3.upload()
有一个您应该使用的 promise 接口(interface)。
const uploadFile = async (data, key) => {
const fileContent = await fs.promises.readFile("/full_path/test.xml");
// Setting up S3 upload parameters
const params = {
"Bucket": "my_bucket",
"Key": key,
"ContentType": "application/xml",
"Body": fileContent
}
// Uploading files to the bucket
const data2 = await s3.upload(params).promise();
console.log(`File uploaded successfully. ${data2.Location}`);
return true;
}
现在 uploadFile()
返回一个 promise,该 promise 在其中的异步操作完成时解析(或者如果有错误则拒绝)。因此,当您将 uploadFile()
的结果推送到一个数组并将其传递给 Promise.all()
时,它将能够告诉您它们何时全部完成完成。
仅供引用,如果 uploadFile()
每次总是读取相同的文件内容,那么您应该在函数外部读取一次,也许将数据传递给 uploadFile()
.
仅供引用,这里有一些 AWS doc关于在 Javascript 界面中使用 promises。值得一读。
关于node.js - NodeJS 将文件写入 AWS S3 - Promise.All with async/await 不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66404410/
我是一名优秀的程序员,十分优秀!