Возврат значений обещания с помощью `then` - PullRequest
1 голос
/ 21 октября 2019

В приведенном ниже фрагменте кода я использую 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, которого я не понимал.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Для того, чтобы зарегистрировать результат, необходимо написать следующее:

describeTable().then(result => console.log(result));
1 голос
/ 21 октября 2019

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

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

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() возвращается в синхронный контекст(журнал консоли) обещание, которое позже будет асинхронно связано через все ваши функции, и вы регистрируете это обещание (которое действительно ожидает рассмотрения).

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

...