Javascript AWS 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: '

我有一个对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函数需要返回字符串。该字符串愉快地驻留在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;
  }