我想在 node.js 中编写一个小型 worker 应用程序。
此应用将从 AWS-SQS 读取数据,以某种方式处理数据,然后将其输出到另一个 AWS-SQS。
到目前为止我已经写了:
while(true){
readFromQueue()
.then(transform)
.then(writeToQueue);
}
function transform(data) {
console.log("> transforming...");
//transformation logic
return data;
}
//TODO: need to remove message from queue after read!
function readFromQueue() {
// var params = {
// QueueUrl: 'STRING_VALUE',
// WaitTimeSeconds: 2
// };
// return new Promise(function(resolve, reject) {
// sqs.receiveMessage(params, function(err, data) {
// if (err) reject(err);
// else resolve(data);
// });
// });
return new Promise(function(resolve, reject) {
console.log("> reading from queue...");
resolve({ data : "world" });
});
}
function writeToQueue(data) {
// var params = {
// MessageBody: data,
// QueueUrl: 'STRING_VALUE',
// };
// sqs.sendMessage(params, function(err, data) {
// if (err) console.log(err, err.stack);
// else console.log(data);
// });
console.log("> writing to queue...");
console.log(">> " + data);
}
如您所见,一切都已为 AWS 设置好,但当我暂时在本地运行它时,我只会在其中放置一些模拟内容,直到我真正测试转换逻辑等...
我遇到的问题是:
- AWS-SQS API 是异步的,需要回调。我用 promise 包装它,因为我更喜欢 promise 而不是回调。尽管如此,我想知道我是否应该阻止它并使其同步而不是异步(出于以下原因,但可能无关)。
- 当我运行它时,我只能看到“从队列中读取...”输出,就好像“transform”和“writeToQueue”没有被执行...
- 但是,如果我注释掉 while 循环(这样脚本只运行一次),我就可以看到所有 3 个步骤的输出。
那我是不是做错了什么?我可以理解,由于 promises 是异步的,我的 while 循环会变得疯狂并创建数千个,所以这让我很担心......不过我想在之前的 read->transform->write 完成后启动另一个循环。我应该在这里使用其他模式吗?或者只是阻塞并等待 readFromQueue 结束......
--编辑--
如果没有包含在 while(true) 中,它会执行所有内容:
readFromQueue()
.then(transform)
.then(writeToQueue);
我也明白,由于 while(true) 正在执行,它实际上会阻塞线程,因此 promise 没有得到解决。那么有什么解决办法吗?
最佳答案
我正在回到我的 setInterval
方式。我知道你说读取队列必须在写入完成后立即开始,但如果你问我,10ms 并不算多。
function someFunc(){
if(readingQueue) return;
readingQueue = true;
return readFromQueue()
.then(transform)
.then(writeToQueue)
.catch(someErrorHandler)
.then(function(){
readingQueue=false;
})
}
var readingQueue = false;
setInterval(someFunc, 10);
关于javascript - while(true) 循环中的 promise /等待 promise 解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32114532/