promise-logic -- 声明式 Promise 逻辑组合
用逻辑概念替代 API 记忆promise-logic 的设计是:开发者应专注于业务逻辑,而非 Promise API 的细节。
传统 Promise 组合(如 Promise.all、Promise.race)的命名与语义不够直观,尤其在复杂异步场景下,代码可读性迅速下降。promise-logic 通过逻辑门(Logic Gate) 的方式,将异步组合抽象为 and、or、xor 等逻辑操作,使代码语义清晰、逻辑自解释。
相关功能
-
逻辑语义化
-
and:所有任务必须成功(等价于Promise.all) -
or:至少一个任务成功(等价于Promise.race) -
xor:有且仅有一个任务成功 -
nand:所有任务均失败 -
not:反转单个 Promise 的结果 -
majority:多数任务成功
-
-
零依赖
仅依赖原生 Promise,无额外运行时依赖。 -
全测试覆盖
所有逻辑门均经过严格单元测试,确保行为符合预期。 -
错误分类明确
-
PromiseLogicError统一错误类型 -
error.type区分具体逻辑错误(如'XOR_ERROR')
-
安装
npm install promise-logic
快速开始
示例:主备服务调用(XOR 场景)
import { PromiseLogic } from 'promise-logic';
// 主服务调用
const primary = fetch('https://api.main.com/data');
// 备用服务调用
const backup = fetch('https://api.backup.com/data');
// 执行 XOR 逻辑:有且仅有一个成功
PromiseLogic.xor([primary, backup])
.then(result => {
console.log('成功获取数据:', result);
})
.catch(error => {
if (error.type === 'XOR_ERROR') {
console.error('主备服务均成功或均失败,不符合 XOR 语义');
} else {
console.error('网络错误:', error);
}
});
示例:多数决决策(Majority 场景)
import { PromiseLogic } from 'promise-logic';
const services = [
fetch('https://api.node1.com/vote'),
fetch('https://api.node2.com/vote'),
fetch('https://api.node3.com/vote')
];
PromiseLogic.majority(services)
.then(results => {
console.log('多数服务返回成功:', results);
})
.catch(error => {
console.error('多数服务失败:', error);
});
typescript类型断言场景
import { PromiseLogic } from 'promise-logic/typescript';
const services = [
fetch('https://api.node1.com/vote'),
fetch('https://api.node2.com/vote'),
fetch('https://api.node3.com/vote')
];
//可以进行类型断言,也可以默认让PromiseLogic自动推断类型
PromiseLogic.majority<Response>(services)
.then(results => {
console.log('多数服务返回成功:', results);
})
.catch(error => {
console.error('多数服务失败:', error);
});
API 参考
| API | 说明 |
|---|---|
and |
所有 Promise 成功,返回结果数组;任一失败则整体失败。 |
or |
至少一个 Promise 成功,返回首个成功结果;全部失败则整体失败。 |
xor |
有且仅有一个 Promise 成功,返回该结果;否则抛出 XOR_ERROR。 |
nand |
所有 Promise 均失败,返回错误数组;任一成功则整体失败。 |
not |
反转单个 Promise 的结果 |
majority |
超过半数 Promise 成功,返回成功结果数组;否则整体失败。 |
资源链接
- GitHub 仓库:github.com/xier123456/…
- npm 包:www.npmjs.com/package/pro…
- Issue 跟踪:GitHub Issues