【问题标题】:Novice: How to use Promises in Javascript?新手:如何在 Javascript 中使用 Promises?
【发布时间】:2020-02-25 01:13:32
【问题描述】:

我正在使用 AWS 异步 lambda 函数,它为我的 Alexa 智能家居技能将数据写入 DynamoDB 表。我遇到的问题是它不使用异步写入数据库。但是,我将它转换为同步,它会正常工作。我在 Javascript 方面没有太多经验,在使用 Promise 方面经验为零。我想知道我的代码/承诺有什么问题。

感谢您的帮助或建议!

exports.handler =  async function (event, context) {

    // Dump the request for logging - check the CloudWatch logs
    console.log("index.handler request  -----");
    sendToDynamo("Signal-01","powerState","ON");

}

function sendToDynamo(endpoint,state,value) {
  console.log("send to dynamo start")

  var ddb = new AWS.DynamoDB({
                  apiVersion: '2012-08-10',
                  region: 'us-east-1'})

  var params = {
      TableName: "TestDB",
      Item: {
          'ItemId':{
            S: endpoint  
          } ,
          'State':{
            S: state  
          } ,
          'Value':{
            S: value  
          } 
      }
  };

  var putObjectPromise = ddb.putItem(params).promise();

    putObjectPromise.then(function(data) {
      console.log('*** Success ***');
    })
    .catch(function(err) {
      console.log(err);
    });
}

【问题讨论】:

    标签: javascript node.js aws-lambda alexa alexa-skills-kit


    【解决方案1】:
    exports.handler =  async function (event, context) {
    
        // Dump the request for logging - check the CloudWatch logs
        console.log("index.handler request  -----");
        let data = await sendToDynamo("Signal-01","powerState","ON").catch(console.log);
        console.log('*** Success ***');
    }
    
    function sendToDynamo(endpoint,state,value) {
      console.log("send to dynamo start")
    
      var ddb = new AWS.DynamoDB({
                      apiVersion: '2012-08-10',
                      region: 'us-east-1'})
    
      var params = {
          TableName: "TestDB",
          Item: {
              'ItemId':{
                S: endpoint  
              } ,
              'State':{
                S: state  
              } ,
              'Value':{
                S: value  
              } 
          }
      };
    
      return ddb.putItem(params).promise();
    }
    

    【讨论】:

    • 感谢您解决我的问题!问题:如何判断 promise 是成功还是拒绝?检查“数据”?
    • 所以你会在catch 中看到我传入的回调函数值是console.log。如果你想知道你是否成功,你可以在 catch 块中实现一些更好的代码然后重新抛出(如果你想这样处理错误)
    • 如果您不想使用await,您可以在sendToDynamo() 调用中复制并粘贴您的.then().catch() 块。所有 await 所做的就是解开承诺。
    • 我想在没有等待的情况下尝试一下。那么,像这样吗?让数据 = sendToDynamo("Signal-01","powerState","ON"); data.then(function(data) { console.log('*** Success ***'); }) .catch(function(err) { console.log(err); });
    • 是的...看起来不错,尽管 cmets 中的格式很笨拙。
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2016-12-13
    • 2020-02-01
    • 2016-04-10
    • 2018-04-29
    • 2015-12-01
    • 2021-02-07
    相关资源
    最近更新 更多