[英]AWS DynamoDB: Returning values from inside a Promise
我有一个对 dynamoDB 的异步调用:
async getCostCenterTagFromTable() {
// Create the DynamoDB service object
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var params = {
TableName: 'csv-table',
Key: {
'BusinessUse': {S: 'eWFM'}
},
ProjectionExpression: 'CostCenter'
};
try {
// Asynchronously retrieve value from DynamoDB
const costCenter = await ddb.getItem(params).promise();
return costCenter;
}catch (error) {
console.error(error);
}
}
我可以很好地查看返回的 Promise 中的内容,但我无法弄清楚如何从 then() 块中删除值并将其返回到另一个函数。 我的 getCostCenterTagValue 函数需要返回一个字符串。 该字符串愉快地驻留在承诺的 then() 块中。 我需要将它取出并归还,但它总是以未定义状态返回。 我知道这是这个调用的异步性质的一个问题,我已经尝试了一切从 then 块中获取该值但无济于事。 任何帮助将不胜感激!
getCostCenterTagValue() {
var costCenter = this.getCostCenterTagFromTable();
costCenter.then(console.log);
//INFO { Item: { AutoTag_CostCenter: { S: '1099:802:000000' } } }
var costCenterString = costCenter.then(data => {
console.log("Cost Center Tag:" + data.Item.AutoTag_CostCenter.S);
//INFO Cost Center Tag:1099:802:000000
return data.Item.AutoTag_CostCenter.S;
}).catch(function(err) {
console.log(err);
});
console.log(costCenter.then())
return costCenterString(???); // or return costCenter.then(???)
}
问题是async getCostCenterTagFromTable()
返回一个承诺。 因此,您需要await
它被消耗的值,如下所示:
async getCostCenterTagValue() {
var costCenter = await this.getCostCenterTagFromTable();
var costCenterString = costCenter.Item.AutoTag_CostCenter.S;
return costCenterString;
}
function logCostCenterTagValue() {
getCostCenterTagValue().then(console.log);
}
这与 AWS 或 Dynamo 没有任何关系,这纯粹是一个异步问题:查看这个广受欢迎的答案以获取更多信息: 如何从异步调用返回响应?
经过多次挫折,我终于找到了一个干净、简单的解决方案:Deasync! 这真的应该是一个内置功能,正是我所需要的。 这让我使用一个变量从异步调用而不局限于一个承诺内则()块的极窄的范围,而我的函数可以返回一个字符串,而不是一个愚蠢的承诺,立即执行。
getCostCenterTagValue() {
let _data;
let done = false;
// Create the DynamoDB service object
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var params = {
TableName: 'csv-table',
Key: {
'BusinessUse': {S: 'eWFM'}
},
ProjectionExpression: 'AutoTag_CostCenter'
};
try {
// Retrieve the item
ddb.getItem(params).promise().then((data) => {
_data = data.Item.AutoTag_CostCenter.S;
done = true;
console.log("CostCenter: " + _data);
});
}catch (error) {
console.error(error);
}
// Wait for asynchronous call to complete!
require('deasync').loopWhile(function(){return !done;});
return _data;
}
这个的制造商应该给自己一个轻拍! 谢谢 Deasync 的创造者 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.