在节点中解析SQS RetrieveMessages

时间:2018-07-25 16:07:37

标签: javascript amazon-web-services amazon-sqs

当从适用于SQS的AWS开发工具包运行示例代码时,出现了一些意想不到的行为。

我有以下使用队列URL的代码。

const getMessage = url => {
  return sqs.receiveMessage(
    {
      QueueUrl: url
    },
    (err, data) => {
      if (err) {
        console.log(err, err.stack); // an error occurred
      } else {
        // console.log(data);
        if (data.Messages) {
          const msg = JSON.parse(data.Messages[0].Body);
          console.log("--");
          return msg
        } else {
          console.log("no messages found");
          return {};
        }
      }
    }
  );
};

const messages = await getMessage(<QUEUE_URL>);
console.log('this statement runs before the other console statements')

我从这里的文档中了解

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html#receiveMessage-property

函数recieveMessage返回一个请求。但是我不明白为什么函数调用后的console语句要在回调中的console.log之前运行,因为我正在等待它的响应。

日志的顺序使我觉得我缺少了操作和包装函数的异步特性。

以前有人遇到过吗?我已经在这上面转了一圈了,似乎无法弄清楚发生了什么。

1 个答案:

答案 0 :(得分:1)

您必须返回Promise才能等待其结果

 const getMessage = url => {
  return sqs.receiveMessage(
    {
      QueueUrl: url
    })
     .promise()
     .then(data=>{
      // process data here
     })
     .catch(e=>{
     // process error here
     })