gpt4 book ai didi

javascript - 异步获取不可预测的 block 大小的最小行数

转载 作者:行者123 更新时间:2023-12-03 02:19:57 26 4
gpt4 key购买 nike

我想从不断填满的队列中检索所有当前可用的文档。我从 Amazon 的 SQS(简单队列服务)中提取数据,该服务会异步返回每个请求 0 到 10 行的数据,其中可能包括之前获取的重复数据。

每个唯一的文档都可以独立于任何其他文档异步并行处理,因此即使有额外的异步查找,这部分在概念上对我来说也很简单。我遇到的麻烦是如何提取正确数量的记录来处理整个批处理。

假设我查看并看到队列中有 100 个文档。如果我只进行 10 次提取,我最终可能只得到 100 个文档中的 50 个……或者如果我非常幸运的话,会得到全部 100 个文档。如果我一次获取 1 个数据,我基本上会遇到同样的问题——我可能会得到 0 或 1 或一个重复数据(它请求对服务器集群进行循环)。如果让每个异步 getter 更新一个公共(public)计数器,则在第一个 getter 知道要计算多少个唯一文档之前,它可能会产生数百个请求。如何确定何时停止从队列中获取其他记录组?

这是失败代码的精炼版本:

libutil.countOffers(function(err, data) {
processEvents(~~data.Attributes.ApproximateNumberOfMessages);
});

function processEvents(count) {
while (count > 0) {
libutil.receiveOffers(10, function(err, offers) {
if (offers && offers.Messages) {
count-=offers.Messages.length;
// ^ Broken because async receiveOffers runs hundreds of
// times before count is incremented the first time.
}
});
}
}

最佳答案

libutil.countOffers(function(err, data) {
processEvents(~~data.Attributes.ApproximateNumberOfMessages);
});

function processEvents(count) {
libutil.receiveOffers(10, function(err, offers) {
if (offers && offers.Messages) {
count-=offers.Messages.length;
if(count > 0){
processEvents(count)
}
}
});
}

您的 while 循环不会等待异步回调中计数增加。因此,请使用递归函数或 Promise。

关于javascript - 异步获取不可预测的 block 大小的最小行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49205767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com