Я получаю данные из Dynamodb с помощью функции aws dbclient.scan. Мне нужно использовать выходные данные для извлечения данных из другой таблицы. Я пытаюсь назначить вывод первого сканирования БД переменной, находящейся за пределами dbclient.scan. Проблема в том, что я получаю пустую переменную, хотя я назначил данные из функции обратного вызова dbclient.scan. Что мне делать? Во всяком случае, я не использовал обещание и асинхронную концепцию. Ниже приведен код, который я написал.
var tmp = []
docClient.scan(params, (error, result) => {
if (error) { .......}
else{ var tmp1 = result.Items[0].data
tmp.push(tmp1)
}
});
console.info(tmp)//empty list
Что мне делать? Большое спасибо, Море



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы неправильно понимаете, как работают Javascript и обратные вызовы. Javascript мгновенно обработает весь файл сверху вниз. Итак, когда вы выполняете console.info(tmp), сканирование DynamoDB, описанное выше, еще не завершено.
Попробуйте изменить свой код на следующий, чтобы просмотреть данные из DynamoDB:
var tmp = []
docClient.scan(params, (error, result) => {
if (error) { .......}
else {
var tmp1 = result.Items[0].data
tmp.push(tmp1)
// now get item using results from scan
var params = {
TableName: "mytable",
Key: {
KeyName: tmp1.KeyName
}
}
docClient.get(params, (error, results) => {
console.info(results)
})
}
});
Я очень рекомендую взглянуть на async / await (Результаты Google для руководств). Это значительно упростит вашу жизнь при работе с вложенными обратными вызовами.
Вам нужно будет ввести обратный вызов, черт возьми, мой друг. Я обновлю ответ, чтобы показать, как вы это сделаете.
Спасибо за помощь, Джон. Теперь он работает. Большое спасибо. Ваше здоровье
пока кто-нибудь не покажет мне разумный способ сделать это с примерами кода из реальной жизни, этот подход обычно будет работать нормально:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let results;
await dynamodb.scan({
TableName : 'your_table_name',
Limit : 10
}, function(err, data) {
results = data;
}.bind(this));
while (results === undefined) {
await sleep(1000);
}Я обнаружил, что это самый простой способ сделать это так:
let request = new AWS.DynamoDB({apiVersion: '2012-08-10'})
let params = {
TableName: 'YOUR_TABLE_NAME',
Key: {
'YOUR_KEY': { S: 'STRING_VALUE_TO_MATCH' }
}
}
let result = await request.getItem(params).promise().then((data) => {
return data.Item
})
// Now you can use result outside of the promise.
console.info(JSON.stringify(result))
Убедитесь, что это внутри асинхронной функции, и она должна работать на вас. Это не для «сканирования», но концепция должна быть такой же.
Джон, потому что мне нужно использовать вывод как ключ для запроса данных из другой таблицы. Если да, то что мне делать.