[英]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.