javascript - while(true) 循环中的 promise /等待 promise 解决

标签 javascript node.js amazon-web-services promise

我想在 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/

相关文章:

node.js - 使用 puppeteer 抓取动态站点

node.js - 如何使用 Node 将二进制对象存储在redis中?

java - 如何从 DynamoDB 表中的项目中删除属性?

javascript - 如何在文本框接收焦点时选择文本框中的特定文本

javascript - 主干对象默认不起作用

javascript - 浏览器 MediaRecorder API - 视频控件不工作/标题设置不正确?

amazon-web-services - 在 Cloudformation 中创建策略,授予从单独的 AWS 账户访问 s3 存储桶的权限

javascript - ES6 - 遍历对象中的键然后分配给新对象

node.js - Express 3 session 总是落后一个请求

amazon-web-services - AWS ECS Service FastAPI 项目存在垃圾邮件 "GET/HTTP/1.1"404 Not Found