【问题标题】:Implementing pagination in async calls在异步调用中实现分页
【发布时间】:2018-03-14 00:32:23
【问题描述】:

我有一个包含大量 json 文件的 AWS。我需要创建一个函数,它将扫描每个 json 文件以查找匹配的属性,并返回每个匹配项。此外,我需要能够实现分页,从而可以指定偏移量和限制,以返回按 s3 键名排序的匹配子范围。

如果 S3 存储桶是一个 sql 表并且每个文件都是表中的一条记录,我会编写以下查询:

SELECT * FROM s3 AS file WHERE file.property = <value> ORDER BY file.key LIMIT <offset>,<limit>

我创建了以下实用函数:

  • listKeys() :返回一个解析 s3 键数组的承诺
  • readFile(s3Key) : 返回一个解析从 json 文件解析的对象的承诺
  • doMatch(object, value) :返回一个承诺,如果有匹配则返回 true,否则返回 false

我创建了以下代码来解决问题。问题是由于readFile 和doMatch 都是异步工作的,matches 数组不会被排序而是随机的。由于文件的数量,重要的是我在获得所需数量的匹配项后立即中断迭代,避免读取许多文件。

如何等待承诺按顺序而不是并行解决?

谢谢:-)

function getMatches(value, offset, limit) {
    return new Promise((resolve) => {
        let matches = [];

        listKeys().then((keys) => {
            for (let i = offset; i < keys.length; i++) {
                let key = keys[i];
                readFile(key).then((object) => {
                    doMatch(object, value).then((isMatch) => {
                        if (isMatch) {
                            matches.push(object);
                        }

                        if (matches.length === limit || i === keys.length-1) {
                            resolve(matches);
                        }
                    });
                });
            }
        });
    });
};

【问题讨论】:

    标签: node.js asynchronous pagination


    【解决方案1】:

    如果您在 S3 中将这些文件保存为 JSON,您应该可以使用 Amazon Athena。

    由于您熟悉 SQL,因此您应该能够构建自己的查询。

    If 将比编写自己的查询函数要容易得多。

    Getting Started with Amazon Athena

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2022-08-18
      • 1970-01-01
      • 2019-08-03
      相关资源
      最近更新 更多