JavaScript中如何通过循环实现redis-om-node的链式方法调用?
实现方案
完全可以实现,不需要什么冷门的JS黑魔法,核心就是搞懂链式调用的本质:链式调用没有任何特殊语法,每次调用方法都会返回支持后续方法的对象实例,你只需要用变量接住每次调用的返回值,循环更新这个中间变量就能自动拼接调用链。
你写的硬编码链式调用,本质和循环持有中间值的逻辑完全等价,没有任何区别。
通用函数实现
先写一个可复用的搜索函数,传入仓库实例、搜索关键词、要匹配的属性数组即可:
/** * 基于redis-om的多字段模糊搜索通用函数 * @param {Repository} repository redis-om仓库实例 * @param {string} query 搜索关键词 * @param {string[]} searchFields 需要匹配的属性名数组 * @returns 匹配的结果数组 */ async function multiFieldSearch(repository, query, searchFields) { // 初始化搜索链起点 let chain = repository.search(); // 遍历属性拼接查询条件:第一个字段用where,后续字段用or连接 for (let i = 0; i < searchFields.length; i++) { const field = searchFields[i]; chain = i === 0 ? chain.where(field).match(query) : chain.or(field).match(query); } // 执行查询返回结果 return chain.return.all(); } // 调用示例 const items = await multiFieldSearch( repositoryObject, "你的搜索关键词", ["property1", "property2", "property3"] );
单行链式写法
如果你想保持和原生调用接近的、不额外封装函数的写法,可以用Array.reduce直接在链式调用里完成遍历拼接,不需要额外声明中间变量:
const searchFields = ["property1", "property2", "property3"]; const items = await searchFields.reduce( (currentChain, field, index) => index === 0 ? currentChain.where(field).match(query) : currentChain.or(field).match(query), repositoryObject.search() ).return.all();
注意:不要用动态拼接代码字符串+
eval的方式实现,上面的写法是标准实现,既没有安全隐患,性能也更好,同时兼容redis-om链式调用返回新实例/返回this两种实现逻辑。
内容的提问来源于stack exchange,提问作者dedeye112
相关产品推荐
相关产品推荐

