我有一个包含大量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)
:返回一个声明解析为真我有匹配,否则为假我创建了以下代码来解决问题。问题是,由于readFile
和doMatch
都是异步的,匹配数组不会被排序,而是随机的。由于文件的数量,一旦我有所需的匹配数量,我就打破迭代非常重要,避免读取到许多文件。
我如何等待承诺以序列而不是并行解决?
谢谢: - )
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);
}
});
});
}
});
});
};
答案 0 :(得分:0)