Асинхронное / ожидание не работает (JavaScript / DynamoDB) - PullRequest
0 голосов
/ 05 мая 2019

У меня есть запрос DynamoDB Put, заключенный в асинхронную функцию.

 async function putter(param1, param2) {

        const paramsPut = {
            TableName: MyTableName,
            Item: {
                "hashKey": param1,
                "sortKey": param2,
            }
        };

        dynamodb.put(paramsPut, function(err, data) {

            if (err) {
                console.log("Failure")
                console.log(data)
                return data
            }
            else {
                console.log("Success")
                console.log(data)
                return data
            }
        });
    };

Возвращение асинхронной функции помещается в функцию ответа - эта функция должна возвращать обещание при выполнении операции put (либо успешно, либо безуспешно).

Затем я вызываю эту асинхронную функцию пут из другой асинхронной функции:

    var param1 = "50";
    var param2 = "60";


    async function main() {

        await putter(param1 , param2)
        console.log("Feedback received")

    }

Когда я вызываю эту основную функцию aysnc, я ожидаю, что она предоставит оператор Success из функции put до написания "Обратная связь получена", так как она должна ожидать ответа функции put.

Однако моя консоль регистрирует "Отзыв получен" до до запись оператора «Success» в асинхронную функцию put , которую я ожидал.

Что мне здесь не хватает? Спасибо за вашу поддержку!

1 Ответ

1 голос
/ 05 мая 2019

Попробуйте изменить код следующим образом:

try {
    const data = await dynamodb.put(paramsPut).promise()
    console.log("Success")
    console.log(data)
    return data
} catch (err) {
    console.log("Failure", err.message)
    // there is no data here, you can return undefined or similar
}

Почти каждая функция из AWS SDK имеет вариант promise() для возврата результата в качестве Promise. Тогда вы можете просто дождаться обещания. Не смешивайте обратные вызовы с обещаниями (async / await) - это затрудняет чтение кода, везде лучше придерживаться одной методики.

...