javascript - 异步/等待不适用于 AWS S3 Node.js SDK

标签 javascript node.js amazon-web-services amazon-s3 aws-sdk

我创建了一个非常简短/简单的示例,说明了我在使用 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()
  })
}
<小时/>

调试器的输出:

enter image description here

<小时/>

我期望消息交错,如果您遵循逻辑流程,这就是有意义的。

应该在准备设计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/

相关文章:

javascript - 比较 JavaScript 中的未定义值

javascript - 物体圆周运动速度变化公式

node.js - Express:continuation-local-storage 可以处理什么负载?

javascript - 使用 node.js 或 javascript 在后端读取套接字 API

amazon-web-services - 如何在各种已部署应用程序的 kubernetes 上下文之间切换?

node.js - 如何使用 KeyConditionExpression 查询 AWS DynamoDb?

maven - 有什么方法可以使用AWS CodeBuild缓存构建依赖项吗?

javascript - 如何创建一个脚本,给出一个网站列表,并使用其搜索功能来获取信息?

javascript - 推进器集成

javascript - Symbol数据类型的应用