【发布时间】:2018-04-02 23:15:55
【问题描述】:
按照文档 http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html
我正在尝试使用 Promise 针对我的 DynamoDB 表编写一个基本测试来处理异步响应,但到目前为止还没有成功。它应该返回一个包含 TableNames 的对象。
如果我在不使用 Promise 的情况下访问 DynamoDB 对象,我没有问题。
这行得通:
import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')
const dynamo = new AWS.DynamoDB({region: 'us-east-2'})
window.test('Test Connection', () => {
return dynamo.listTables({Limit: 10}, (err, data) => {
if (err) {
console.log('err', err)
} else {
console.log('TableNames are:', data)
}
window.expect(data).toEqual(window.expect.anything())
})
})
这不是:
import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')
const dynamo = new AWS.DynamoDB({region: 'us-east-2'})
window.test('Test Connection', () => {
let tables
const listPromise = dynamo.listTables({Limit: 10}).promise()
listPromise.then((data) => {
tables = data
console.log('TableNames are:', data)
}).catch((err) => {
console.log('Error:', err)
})
window.expect(tables).toEqual(window.expect.anything())
})
数据的值总是未定义的。我找不到任何表明 DynamoDB 请求不支持承诺的文档,所以我几乎可以肯定我遗漏了一些明显的东西......
感谢任何帮助。这是我第一次在这个论坛上提问,因此也感谢您对问题本身的反馈。
编辑:问题已解决 - 新手错误
问题不在于 dynamoDB,而在于使用 test。在处理 Promise 时,必须将 Promise 返回到test 以进行正确评估。否则无法评估。
工作代码:
import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')
const dynamo = new AWS.DynamoDB({region: 'us-east-2'})
window.test('Test Connection', () => {
const listPromise = dynamo.listTables({Limit: 10}).promise()
return listPromise.then((data) => {
window.expect(data).toEqual(window.expect.anything())
}).catch((err) => {
console.log('Error:', err)
})
})
更多信息:https://facebook.github.io/jest/docs/en/asynchronous.html
感谢@Brahma Dev 的帮助。
【问题讨论】:
-
将
window.expect移动到then内。 -
感谢您的回复。我有你提议的改变,但行为是一样的。除非我弄错了,否则这无关紧要,因为
tables是在承诺之外定义的,并且在调用window.expect()时仍应保留数据的值。我还尝试在then中使用window.expect(data)而不是window.expect(tables),结果相同(正如人们所期望的那样)。事实证明,这个问题更难解决,因为控制台消息也不起作用...... -
您正在运行异步代码。 window.expect 将在 dynamodb 返回任何内容之前运行。这就是为什么它需要在
then内。如果 console.log 没有显示任何内容,那么这是一个完全独立的问题。你的程序会立即关闭吗? -
感谢您的澄清。这是完全有道理的,我确实认识到控制台问题是另一回事。因此,我认为行为相同的假设是错误的,因为它基于
tables仍在报告未定义值的事实。事实上,无论我对它设置什么条件,测试现在都会错误地通过。程序不退出或出错。 -
我相信我可能已经发现了我的问题。我没有正确实现
test的承诺,因为我没有返回承诺。用return listPromise.then((data) => {替换:listPromise.then((data) => {似乎已经解决了。
标签: javascript node.js promise amazon-dynamodb jestjs