如何解决为什么我的 for await 循环在异步迭代器中无限循环?
我正在使用 s3 aws-sdk 来获取多个文件中的多个记录。 s3.selectObjectContent 调用返回一个读取流。我使用 .map 返回这些读取流的列表,然后等待对该列表的所有承诺承诺,以获得可读流的列表。然后我尝试 for await 循环遍历所有流以获取块并作为一个块列表返回,以便创建所有事件/块的单个读取流。
现在,这个 for await 在 .map 内部时有效,但是一旦我在地图返回后在外面执行它,它就会无限循环。
async function* concatenateStreamsOrdered(streams) {
for (const stream of streams) {
for await (const chunk of stream) {
yield chunk
}
}
}
async function getS3SelectObjectsstreams(bucket,sourceKeys,expression) {
let readStreamPromises =
sourceKeys.map(
async sourceKey => {
let selectParameters = {
Bucket: bucket,Key: sourceKey,Expression: expression,ExpressionType: 'sql',InputSerialization: {
JSON: {
Type: 'DOCUMENT'
}
},OutputSerialization: {
JSON: {
RecordDelimiter: ','
}
}
};
let result = await s3.selectObjectContent(selectParameters).promise();
// for await (const event of result.Payload) {}
return result.Payload;
}
);
let readStreams = await Promise.all(readStreamPromises);
const iterableStreams = await concatenateStreamsOrdered(readStreams);
return stream.Readable.from(iterableStreams);
}
因此,当我取消注释上面评论的 for await 时,它可以立即响应,没有问题。当我将其注释掉时,concatenateStreamsOrdered 函数中的 for await 将永远循环。
读取流(result.Payload)是否以某种方式分离?我如何让它在 concatenateStreamsOrdered 函数而不是 map 函数中工作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。