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

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

我想在node.js中编写一个小型工作程序.
该应用程序将从AWS-SQS中读取数据,以某种方式处理数据,然后将其吐出到另一个AWS-SQS中.
到目前为止,我已经写了:

@H_404_7@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)中,它将执行所有操作:

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

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

解决方法:

我回到了setInterval的方式.我知道您说过,阅读队列必须在写作结束后立即开始,但是10ms的延迟并不算多.

@H_404_7@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] 举报,一经查实,本站将立刻删除。

相关推荐