在异步调用中实现分页

时间:2017-10-02 21:24:40

标签: node.js asynchronous pagination

我有一个包含大量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):返回一个声明解析为真我有匹配,否则为假

我创建了以下代码来解决问题。问题是,由于readFiledoMatch都是异步的,匹配数组不会被排序,而是随机的。由于文件的数量,一旦我有所需的匹配数量,我就打破迭代非常重要,避免读取到许多文件。

我如何等待承诺以序列而不是并行解决?

谢谢: - )

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);
                        }
                    });
                });
            }
        });
    });
};

1 个答案:

答案 0 :(得分:0)

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

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

如果更容易,而不是编写自己的查询函数。

Getting Started with Amazon Athena