Ожидание одного обратного вызова (чтобы получить данные) перед другим - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь заставить 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;
};

1 Ответ

0 голосов
/ 16 октября 2018

Вы должны сначала понять поведение async.

Вы выполняете обратный вызов до завершения выполнения метода

Вы можете изменить get с обещанием

Пример

если 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;
    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);
    })
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...