Javascript AWS DynamoDB:从承诺内部返回值
我有一个对dynamoDB的异步调用:Javascript AWS DynamoDB:从承诺内部返回值,javascript,amazon-web-services,asynchronous,async-await,amazon-dynamodb,Javascript,Amazon Web Services,Asynchronous,Async Await,Amazon Dynamodb,我有一个对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: '
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函数需要返回字符串。该字符串愉快地驻留在promise的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(???)
}
问题在于
异步getCostCenterTagFromTable()
返回一个承诺。因此,您需要等待
消耗它的值,如下所示:
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!这应该是一个内置的特性,这正是我所需要的。这使我可以使用异步调用中的变量,而不受承诺中then()块的极窄范围的限制,并且我的函数可以立即返回字符串而不是愚蠢的承诺 制造这种产品的人应该拍拍自己的背!感谢Deasync的创建者:)
谢谢,但这并不能回答我的问题;在最初的帖子中,“getCostCenterTagValue函数需要返回字符串”。请更新答案,以便返回实际字符串,而不仅仅是登录到控制台。我需要获取then()之外的值,不幸的是,它不是这样工作的。如果要使用该值执行某些操作,则必须在
中执行,然后在某个点执行。试着阅读我提供的关于非常详细答案的链接,这是一个常见的JavaScript问题,不能像处理同步代码一样来解决。访问then()块内的值不是问题,我一直能够做到这一点,问题是让那些位于then块外的值在世界其他地方使用。必须有办法做到这一点(使用回调)。我尝试将值存储到then()块中的全局变量中,但这也不起作用,非常令人沮丧,我认为也没有必要等待第二次。由于getCostCenterTagFromTable中对getItem的原始调用正在等待它的承诺,所以当它被传递到getCostCenterTagValue时,它已经被解决了,所以无需再等待一次,对吗?const costCenter=wait ddb.getItem(params.promise();任何人马特的答案仍在挣扎,不符合要求。这是否回答了你的问题?
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;
}