我创建了一个非常简短/简单的示例,说明了我在使用 Node.js 的 aws-sdk
包的脚本中遇到的 Promise
问题。
简而言之,脚本不等待await
关键字。它会循环执行循环,而不等待 async
函数成功完成后再继续。
代码示例:
<小时/>main.js
const AWS = require('aws-sdk')
import constants from '@/constants'
AWS.config.update({
accessKeyId: constants.awsAccessKey,
secretAccessKey: constants.awsSecretAccessKey,
region: constants.awsRegion
})
export const s3 = new AWS.S3({apiVersion: '2006-03-01'})
单击某个按钮并触发 testS3()
方法...
testActions.js
import { s3 } from '@/main.js'
export async function testS3 () {
const testParams = {
Bucket: AWS_BUCKET,
Key: `test_file.txt`,
Body: 'Testing stuff'
}
async function testFunction(layer) {
console.log('in prepare design 1')
const result = await s3.putObject(testParams).promise()
console.log(`the results: ${result}`)
}
[1,2,3].forEach(async (x) => {
const result = await testFunction()
})
}
<小时/>
调试器的输出:
<小时/>我期望消息交错,如果您遵循逻辑流程,这就是有意义的。
应该在准备设计1
中,然后然后显示结果...
,然后再进行两次。
在准备设计 1 中显示的输出立即显示三次,这表明循环在继续之前没有等待函数。
<小时/>我是否在某种程度上设置了async
/await
错误?我已经尝试了多次不同的迭代,但似乎无法按照我的预期进行工作。
最佳答案
显示的行为是正确的,因为 forEach
的处理程序也是一个 async
函数:
async (x) => {
const result = await testFunction()
}
因此 forEach
循环将立即运行 3 个异步函数。这些函数中的每一个都将异步等待
Promise 链的其余部分。
如果您想要同步执行,请使用普通的 for 循环:
for(var i=0; i<3; i++){
const result = await testFunction()
}
关于javascript - 异步/等待不适用于 AWS S3 Node.js SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54644016/