Возврат значений промисов с помощью `then`

В приведенном ниже фрагменте кода я использую then для получения результата обещания. Однако response не возвращается. Возвращается Promise { <pending> }.

Я зарегистрировал response и вижу, что он правильно вернул данные, а не ожидающее обещание. Так почему же он возвращает отложенное обещание? Я даже добавил вызов then к вызову describeTable, и он все равно возвращается в ожидании.

Я прочитал следующие вопросы, и они не помогли, поэтому, пожалуйста, не отмечайте их как дубликаты:

Как вернуть ответ на асинхронный вызов?< /а>

async/await неявно возвращает обещание?

const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-2'});
const docClient = new AWS.DynamoDB;

async function describeTable() {
    const params = {
        TableName: 'weatherstation_test',
    };

    let response;
    try {
        response = await docClient.describeTable(params).promise().then(result => result);
        console.log(response); // Logs the response data
    } catch (e) {
        console.error(e)
        throw e;
    }
    return response;
}

console.log(describeTable().then(result => result)); // Logs Promise { <pending> }

Обновить

Поэтому я удалил первую then (после promise()), потому что она избыточна. Ответ от @libik работает для меня. Это был контекст, в котором запускается then, которого я не понимал.


person HenryTK    schedule 21.10.2019    source источник
comment
Если вы используете await, нет необходимости в построении then.   -  person Daniyal Lukmanov    schedule 21.10.2019
comment
Попробуйте удалить .then(...)   -  person Daniyal Lukmanov    schedule 21.10.2019


Ответы (2)


Вы не можете получить доступ к асинхронному контенту из синхронного.

Если вы хотите зарегистрировать это, вы должны сделать это изнутри, как это

describeTable().then(result => console.log(result))

В вашем случае вы регистрируете вывод асинхронной функции, что всегда является обещанием.


Что происходит на самом деле: в Node.js весь синхронный контент выполняется первым, а любой асинхронный контент помещается в цикл событий для последующего выполнения.

Итак, сначала это выполняется

const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-2'});
const docClient = new AWS.DynamoDB;
console.log(describeTable()

Функция вызывается, поэтому она входит внутрь функции. Поскольку это асинхронная функция, она будет выполняться синхронно до первого await.

const params = {
        TableName: 'weatherstation_test',
    };

    let response;
    try {
        response = await docClient.describeTable(params).promise()

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

И теперь ваш синхронный контекст заканчивается. Прежде чем приведенное выше обещание будет разрешено, ваше приложение может тем временем выполнять другие части (что всегда одно и то же, брать событие из цикла событий, выполнять полную синхронную часть, которая может помещать другие события в цикл событий, а затем принимать другое событие и повторять)

person libik    schedule 21.10.2019

Для логирования результата нужно написать следующее:

describeTable().then(result => console.log(result));
person MhdSyrwan    schedule 21.10.2019