Передавать данные из обратного вызова (сканирование aws Dynamodb) за пределы

Я получаю данные из 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

Что мне делать? Большое спасибо, Море

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
1 039
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы неправильно понимаете, как работают 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 для руководств). Это значительно упростит вашу жизнь при работе с вложенными обратными вызовами.

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

Instasea 06.04.2018 04:47

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

John Veldboom 06.04.2018 14:30

Спасибо за помощь, Джон. Теперь он работает. Большое спасибо. Ваше здоровье

Instasea 09.04.2018 02:59

пока кто-нибудь не покажет мне разумный способ сделать это с примерами кода из реальной жизни, этот подход обычно будет работать нормально:

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

Убедитесь, что это внутри асинхронной функции, и она должна работать на вас. Это не для «сканирования», но концепция должна быть такой же.

Другие вопросы по теме