在下面的代码片段中,我使用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
。
答案 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));