我正在尝试运行这段代码:
setInterval(function () {
var params = {
QueueUrl: 'https://sqs.us-east-1.amazonaws.com/821808622769/Teste', // required
MaxNumberOfMessages: 10
};
sqs.receiveMessage(params, function (err, data) {
if (err)
console.log('Erro de SQS:' + err);
else {
var retorno = data.Messages;
for (var i in data.Messages) {
var queryString = 'SELECT now()'; //dummy query, just for tests
db_connection.query(queryString, null, function (err, rows, fields) {
if (err) {
console.log('Erro no BD:' + err);
return;
}
var date = new Date();
console.log(retorno[i].Body + ' ' + date.getTime().toString());
});
}
console.log();
}
});
}, 30000);
我在AWS SQS中有5条消息,例如:
但是当我运行我的代码时,而不是每个消息的retorno [i] .Body,有时我会重复一条消息,如图中所示
我的for循环运行从1到5个查询,但是如何将回调内的retorno [i]传递给数据库查询?我的意思是,我该如何识别我正在处理的消息?
答案 0 :(得分:0)
使用.bind(),您可以将i
的内部版本设置为与循环中i
的版本相同。
.bind({i:i})
并将内部代码更改为引用this.i
for (var i in data.Messages) {
var queryString = 'SELECT now()'; //dummy query, just for tests
db_connection.query(queryString, null, function(err, rows, fields) {
if (err) {
console.log('Erro no BD:' + err);
return;
}
var date = new Date();
console.log(retorno[this.i].Body + ' ' + date.getTime().toString());
}.bind({
i: i
});
}
}