簡體   English   中英

AWS DynamoDB:從 Promise 內部返回值

[英]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 的創造者 :)

https://www.npmjs.com/package/deasync

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM