【问题标题】:Waiting for one callback to be done (to get data) before the other等待一个回调在另一个之前完成(获取数据)
【发布时间】:2018-10-16 21:28:57
【问题描述】:

我试图让 MedGuideURL 在第二个回调中使用,但它的值为空。似乎第二个回调总是在第一个回调完成之前发生。我正在考虑使用 Promise/Observable 但有更简单的方法吗?

var qrImage = require('qr-image');
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region:'us-west-2'});

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

    var path = event.path;
    var drugId = path.replace(/\//g, '');
    var MedGuideURL = "";

    var params = {
    TableName: 'QRCodeInfo',
    Key: {
      "DrugId" : drugId
    }
  };
  docClient.get(params, function(err,data) {
    if (err) {
      callback(err,null);
    } else {
      console.log("The data is: "+ data.Item.MedGuideURL); //correct value
      callback(null,data);                                   
      MedGuideURL = data.Item.MedGuideURL;
    }

  });

  callback(null, sendRes(200, MedGuideURL)); //MedGuideURL is empty!
};

const sendRes = (status, body) => {
  //console.log(body);
  const svg_string = qrImage.imageSync(body, { type: 'svg', size: 10 });
  var response = {
    statusCode: status,
    headers: {
      "Content-Type": "image/svg+xml"
    },
    body: svg_string
  };
  return response;
};

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda


    【解决方案1】:

    你需要先了解async的行为。

    在方法完成之前你已经做了回调

    你可以用 promise 更改get

    例子

    如果sendResispromise方法

    exports.handler = function (event, context, callback) {
      var path = event.path;
      var drugId = path.replace(/\//g, '');
      var MedGuideURL = "";
    
      var params = {
        TableName: 'QRCodeInfo',
        Key: {
          "DrugId": drugId
        }
      };
      docClient.get(params).promise().then((data) => {
        console.log('success' + x);
        console.log("The data is: " + data.Item.MedGuideURL);
        MedGuideURL = data.Item.MedGuideURL;
        return sendRes(200, MedGuideURL); //if sendResis promise method
      }).then((finalResponse) => {
        callback(null, finalResponse);
      })
        .catch((err) => {
          callback(err, null);
        })
    };
    

    如果 sendResis 不是承诺:

    exports.handler = function (event, context, callback) {
      var path = event.path;
      var drugId = path.replace(/\//g, '');
      var MedGuideURL = "";
    
      var params = {
        TableName: 'QRCodeInfo',
        Key: {
          "DrugId": drugId
        }
      };
      docClient.get(params).promise().then((data) => {
        console.log('success' + x);
        console.log("The data is: " + data.Item.MedGuideURL);
        MedGuideURL = data.Item.MedGuideURL;
        let finalResponse = sendRes(200, MedGuideURL); //if sendResis not promise method
        return  callback(null, finalResponse);
      })
        .catch((err) => {
          callback(err, null);
        })
    };
    

    【讨论】:

    • 谢谢它正在工作。作为 nodejs 的新手,我不确定如何使用 Promise 来处理异步问题。你的代码帮助我理解它的合成器和流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多