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

为什么我的 for await 循环在异步迭代器中无限循环?

如何解决为什么我的 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 举报,一经查实,本站将立刻删除。