【发布时间】: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