Async / await Не работает с AWS S3 Node.js SDK - PullRequest
0 голосов
/ 12 февраля 2019

Я создал очень короткий / простой пример проблемы с Promise s в сценарии, использующей пакет aws-sdk для Node.js.

Короче говоря, сценарий не в ожидании ключевого слова 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


Я ожидал, что сообщения будут чередоваться , и это имеет смысл, если вы следуете потоку логики.

Это должно быть in prepare design 1, и , затем , отобразить the results..., затем пройти и сделать это еще 2 раза.

Выход, отображающий in prepare design 1 три разасразу же показывает мне, что цикл не ждет функции, прежде чем продолжить.


Я неправильно настроил async / await?Я пробовал несколько разных итераций и не могу заставить это работать так, как я ожидаю.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Это дополнение к ответу AVAVT (так как я не могу его комментировать), вы также можете сделать так, чтобы вам не приходилось вручную вводить число итераций и намереваться использовать значение итерации.

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}`)
  }

  for (const iterator of [1,2,3]) {
      const result = await testFunction();
  }

}

0 голосов
/ 12 февраля 2019

Отображаемое поведение корректно, поскольку обработчик forEach также является функцией async:

  async (x) => {
    const result = await testFunction()
  }

Таким образом, цикл forEach сразу запустит 3 асинхронные функции.Каждая из этих функций будет await для остальной части цепочки обещаний асинхронно.

Если вы хотите синхронного выполнения, используйте обычный цикл for:

for(var i=0; i<3; i++){
  const result = await testFunction()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...