При использовании async/await
вам не нужно использовать callback
и вам не нужно попадать в Обетованный Ад.
Просто await
на ваши обещания и получить результат. Большое преимущество здесь в том, что ваш код выглядит синхронно.
Вот ваш переработанный код:
const AWS = require("aws-sdk");
const game = require('game-api');
const uuid = require("uuid");
AWS.config.update({
region: "us-east-1"
});
exports.handler = async (event) => {
//set db
var documentClient = new AWS.DynamoDB.DocumentClient()
//params
const params = {
Item: {
'id': uuid.v1(),
'player_1_name': null,
'player_1_network': null,
'player_1_matches': 0,
'player_1_kills': 0,
'player_1_last_updated': 0,
'player_2_name': null,
'player_2_network': null,
'player_2_matches': 0,
'player_2_kills': 0,
'player_2_last_updated': 0,
'match_id': 0,
'status': 0
},
TableName : 'matches'
};
var matchData = JSON.parse(event.body);
//player 1
const player_1_name = matchData.player_1_name ? matchData.player_1_name : null;
const player_1_network = matchData.player_1_network ? matchData.player_1_network : null;
//player 2
const player_2_name = matchData.player_2_name ? matchData.player_2_name : null;
const player_2_network = matchData.player_2_network ? matchData.player_2_network : null;
//match data
const match_id = matchData.match_id ? matchData.match_id : 0;
//game object
let gameAPI = new game(
[
"email@email.com",
"password"
]
);
//gameAPI.login() returns a Promise()
await gameAPI.login()
const stats = await gameAPI.getStats(player_1_name, player_1_network)
params.Item.player_1_matches = stats.lifetimeStats.matches;
params.Item.player_1_kills = stats.lifetimeStats.kills;
//example insert
await documentClient.put(params).promise();
};
Если вам нужно обработать исключения (вы должны), просто оберните ваши ожидающие вызовы в блоки try/catch
, например:
try {
console.log(await somePromise)
} catch (e) {
console.log(e)
}
Фрагмент выше эквивалентен:
somePromise.then(console.log).catch(console.log)
с той большой разницей, что вам не нужно связывать обещания / асинхронный код, чтобы сохранить порядок выполнения, поэтому я настоятельно рекомендую вам выбрать подход async/await
и забыть о .then().catch()