用`then`返回承诺值

时间:2019-10-21 09:26:04

标签: node.js promise aws-sdk-nodejs

在下面的代码片段中,我使用then来获取诺言的结果。但是,不会返回response。返回的是Promise { <pending> }

我已经登录response,可以看到它正确地返回了数据,而不是未处理的承诺。那么为什么要返回未完成的承诺呢?我什至在对then的呼叫中添加了一个describeTable呼叫,但仍返回待处理状态。

我已阅读以下问题,但对您没有帮助,因此请不要将其标记为重复项:

How do I return the response from an asynchronous call?

async/await implicitly returns promise?

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 个答案:

答案 0 :(得分:1)

您无法从同步内容访问异步内容。

如果要记录它,必须像这样从内部完成

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()返回到同步上下文(控制台日志),该承诺将在以后通过所有功能异步链接,并记录此内容承诺(确实有待解决)。

现在您的同步上下文结束了。在上述承诺得到解决之前,您的应用程序可以同时执行其他部分(始终相同,从事件循环中获取事件,执行完整的同步部分-可以将另一个事件推送至事件循环,然后执行另一个事件并重复)

答案 1 :(得分:1)

为了记录结果,您需要编写以下内容:

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