微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-在while(true)循环中承诺/等待诺言解决

我想在node.js中编写一个小型工作程序.
该应用程序将从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是异步的,需要回调.我用诺言包装了它,因为我更喜欢诺言而不是回调.尽管如此,我想知道是否应该阻止它并使它同步而不是异步(由于以下原因,但可能无关).
>运行此命令时,我只能看到“从队列读取..”输出,几乎就像未执行“ transform”和“ writetoQueue”一样.
>但是,如果我注释掉while循环(因此脚本仅运行一次),则可以看到所有3个步骤的输出.

那我做错什么了吗?我可以理解,由于promise是异步的,所以我的while循环会变得疯狂并创建成千上万的promise,这让我感到担忧.尽管如此,我希望在先前的读取-> transform-> write完成后启动另一个循环.还有其他我应该使用的模式吗?或者只是阻塞并等待readFromQueue结束…

– 编辑 –
如果不包装在while(true)中,它将执行所有操作:

readFromQueue()
        .then(transform)
        .then(writetoQueue);

我还理解,由于while(true)被执行,它将本质上阻塞线程,因此不能解决诺言.那么有没有办法解决呢?

解决方法:

我回到了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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐