gpt4 book ai didi

node.js - 返回 promise 值 `then`

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:27 24 4
gpt4 key购买 nike

在下面的代码片段中,我使用 then以获得 promise 的结果。然而,response不被退回。返回的是Promise { <pending> } .

我已登录response并可以看到它正确返回了数据,而不是待处理的 promise 。那么为什么它会返回一个待处理的 promise 呢?我什至添加了 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 的背景。正在运行,我不明白。

最佳答案

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

如果你想记录它,你必须像这样从内部进行

describeTable().then(结果 => console.log(结果))

在您的情况下,您正在记录异步函数的输出,这始终是一个 promise 。

<小时/>

实际发生的情况:在 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()

现在,这个 Promise 被添加到事件循环中以便稍后执行,并且函数 describeTable() 返回到 Promise 的同步上下文(控制台日志),该 Promise 稍后将通过您的所有函数异步链接,并且您记录这个 Promise(实际上是待处理的)。

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

关于node.js - 返回 promise 值 `then`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58483379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com