javascript-在while(true)循环中承诺/等待诺言解决
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-在while(true)循环中承诺/等待诺言解决,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2290字,纯文字阅读大概需要4分钟。
内容图文
![javascript-在while(true)循环中承诺/等待诺言解决](/upload/InfoBanner/zyjiaocheng/681/4f3718a274bd41bcaf86875b127986b5.jpg)
我想在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);
内容总结
以上是互联网集市为您收集整理的javascript-在while(true)循环中承诺/等待诺言解决全部内容,希望文章能够帮你解决javascript-在while(true)循环中承诺/等待诺言解决所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。