Вернуть Promise из DynamoDB до выхода Alexa - PullRequest
0 голосов
/ 09 октября 2018

Создание навыка Alexa, который требует настойчивости.

Я звоню в базу данных, чтобы узнать подробности пользователя до управления потоком, и я пытаюсь заставить узел ждать ответ от DynamoDB (используя Dynasty.js для обработки соединения с БД).

Я испробовал целый ряд различных подходов "блокировка" / асинхронизация обещаний / обратных вызовов / узлов, и лучшее, что я могу сделать, - это отображать ответ (в журналах CloudWatch), когда пользователь выходит из навыка.Мне бы очень хотелось, чтобы конфигурация пользователя происходила в начале процесса, а не в конце!

var credentials = {
    accessKeyId: process.env.MY_ACCESS_KEY_ID,
    secretAccessKey: process.env.MY_SECRET_ACCESS_KEY
};

var dynasty = require('dynasty')(credentials);
var tableName = dynasty.table('dynamoTable');

const promiseFunc = new Promise((resolve,reject)=>{
  var myUser = tableName.find(userId);
  setTimeout(_=>{resolve(myUser)}, 2000);
});

var checkUser = async function(){
	if (true) {
		console.log('check, check, 1, 2, 3');
		await promiseFunc.then(function(myUser) {
			if (myUser) {
				console.log("USER FOUND");
				console.log(myUser);
			} else {
				console.log("no user! sigh deeply and start again");
			}
		})
	}
	console.log("do more stuff now");
}

exports.handler = function(event, context) {	
	
  userId = event.session.user.userId;
	const alexa = Alexa.handler(event, context);
	
  // only check the first time, and only once the userId is properly constructed
	if (!(userId.startsWith('amzn1.ask.account.testUser')) && (checkedUser != 1)) {
		checkedUser = 1;
		checkUser();
	}
	
	alexa.resources = languageString;
	alexa.registerHandlers(newSessionHandlers, startStateHandlers, triviaStateHandlers, helpStateHandlers, stopStateHandlers);
	alexa.execute();
};

Как заставить узел ждать ответа от DynamoDB до запуска остальной части сценария ...

1 Ответ

0 голосов
/ 09 октября 2018

Это устаревшая ссылка, но в соответствии с ней , вы можете получить обещание от DynamoDB с помощью метода .promise().Имея это в виду ...

function findUser(userId) {
    // initialize tableName somehow
    return tableName.find(userId)
}

async function checkUser() {
    // initialize userId somehow
   let myUser = await findUser(userId);
   console.log(`found user ${myUser}`);
   return myUser;
}

Наконец, не забудьте дождаться вашего звонка в checkUser () ...

if (/* long condition */) {
    checkedUser = 1;
    let myUser = await checkUser();
}
...