通过为 promise 添加静态方法或包装器,在创建时根据配置自动分类。具体做法是定义一个 createpromise 函数,接收任务函数和分类标签,返回带有 category 属性的 promise 实例。这样可以在后续统一处理不同类别的异步结果。

如何为 Promise 实例添加自定义属性
JavaScript 原生 Promise 对象本身不支持直接挂载自定义属性,因为它是不可变的状态机。要实现自动分类,必须在 Promise 创建后、返回前进行包装。可以使用 Object.defineProperty 将 category 属性定义为不可枚举,避免污染迭代过程。核心逻辑是在 then 链中保持属性传递,或者在构造函数外部直接赋值(但需注意 async/await 解包后的丢失问题)。

function createPromise(task, category) {
const promise = new Promise(task);
Object.defineProperty(promise, 'category', {
value: category,
enumerable: false,
writable: true,
configurable: true
});
return promise;
}
// 使用示例
const p = createPromise((resolve) => resolve(42), 'network');
console.log(p.category); // 'network'
console.log(Object.keys(p)); // []
上述代码展示了如何在创建时绑定分类。注意 enumerable: false 确保 for...in 或 Object.keys 不会遍历到该属性,保持对象整洁。若需跨 then 传递,需在回调中手动重新附加属性或使用 Promise.prototype.then 的 polyfill 逻辑。
如何处理分类后的 Promise 集合
当多个异步操作被分类后,通常需要将它们分组执行或监控。可以利用 Promise.all 结合 reduce 将一组 Promise 按 category 属性归类。由于 Promise.all 会等待所有 Promise 完成并返回结果数组,我们需要先收集所有 Promise 实例,再提取其分类信息构建映射表。关键步骤是遍历输入数组,检查每个 Promise 的 category 属性,并将其推入对应的结果数组中。

function groupPromises(promises) {
return promises.reduce((groups, p) => {
const cat = p.category || 'default';
if (!groups[cat]) groups[cat] = [];
groups[cat].push(p);
return groups;
}, {});
}
// 使用示例
const tasks = [
createPromise(() => setTimeout(() => console.log('a'), 100), 'io'),
createPromise(() => setTimeout(() => console.log('b'), 50), 'compute')
];
const grouped = groupPromises(tasks);
console.log(grouped.io.length); // 1
console.log(grouped.compute.length); // 1
此方法允许开发者对特定类别的 Promise 执行批量操作,例如单独取消或重试。注意 groupPromises 仅做分类,不触发执行。若需执行,可对每个组调用 Promise.all。分类键默认为 'default' 以处理未标记的 Promise,确保健壮性。
基于 Promise 的 category 属性值过滤特定类型
在实际应用中,可能需要仅处理某一类异步结果,例如只等待网络请求完成。可以通过 Array.filter 筛选出具有特定 category 值的 Promise,然后对其应用 Promise.all。这避免了等待无关任务(如日志记录或后台计算)。实现时需确保筛选后的数组非空,否则 Promise.all 立即解析为空数组。此外,若某 Promise 未设置 category,应排除在过滤结果之外,除非显式指定默认类别。
function waitForCategory(promises, targetCategory) {
const filtered = promises.filter(p => p.category === targetCategory);
if (filtered.length === 0) {
return Promise.resolve([]);
}
return Promise.all(filtered);
}
// 使用示例
waitForCategory(tasks, 'io').then(results => {
console.log('IO results:', results);
});
该函数返回一个新的 Promise,仅在目标类别的任务全部完成后解析。若 targetCategory 不存在于任何 Promise 中,则立即返回空数组,不会阻塞。这种模式适用于微服务架构中按模块隔离异步依赖的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











