当从适用于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之前运行,因为我正在等待它的响应。
日志的顺序使我觉得我缺少了操作和包装函数的异步特性。
以前有人遇到过吗?我已经在这上面转了一圈了,似乎无法弄清楚发生了什么。
答案 0 :(得分:1)
您必须返回Promise才能等待其结果
const getMessage = url => {
return sqs.receiveMessage(
{
QueueUrl: url
})
.promise()
.then(data=>{
// process data here
})
.catch(e=>{
// process error here
})