用promise实现状态机异步流转的核心是将各状态封装为返回promise的函数,通过链式调用或async/await控制顺序,并在迁移前校验合法性;例如订单流程created→paid→shipped→delivered需按规则逐级流转。

用 Promise 实现状态机异步流转,核心是把每个状态封装成返回 Promise 的函数,再通过链式调用(.then())或 async/await 控制执行顺序,同时在状态迁移前校验合法性。
定义状态和迁移规则
先明确状态集合、合法转移路径,避免非法跳转。例如一个简单的订单流程:created → paid → shipped → delivered,不能从 created 直接到 shipped。
可用一个对象描述允许的下一状态:
const transitions = {
created: ['paid'],
paid: ['shipped'],
shipped: ['delivered'],
delivered: []
};
每个状态封装为 Promise 函数
每个状态函数做两件事:检查能否进入该状态、执行对应异步操作(如 API 调用、延时模拟),成功后 resolve 下一状态名或直接 resolve 新状态实例。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
例如:
function toPaid(orderId) {
return new Promise((resolve, reject) => {
// 模拟异步校验与更新
setTimeout(() => {
console.log(`Order ${orderId} paid`);
resolve('paid'); // 返回下一个合法状态
}, 300);
});
}
function toShipped(orderId) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`Order ${orderId} shipped`);
resolve('shipped');
}, 400);
});
}
用 Promise 链控制流转
按顺序调用状态函数,利用上一个的 resolve 值决定下一步——可手动判断,也可统一用调度器管理:
- 简单链式写法(适合固定流程):
toPaid('ORD-123')
.then(state => state === 'paid' ? toShipped('ORD-123') : Promise.reject('Invalid state'))
.then(state => console.log('Done:', state));
- 通用调度器(推荐):接收当前状态、目标状态、上下文,自动查表+调用对应函数:
const handlers = { toPaid, toShipped, toDelivered };
function transition(current, target, context) {
const allowed = transitions[current] || [];
if (!allowed.includes(target)) {
return Promise.reject(new Error(`Cannot go from ${current} to ${target}`));
}
const handler = handlers[`to${target.charAt(0).toUpperCase() + target.slice(1)}`];
return handler ? handler(context) : Promise.resolve(target);
}
// 使用
transition('created', 'paid', 'ORD-123')
.then(() => transition('paid', 'shipped', 'ORD-123'))
.then(() => transition('shipped', 'delivered', 'ORD-123'))
.catch(err => console.error(err.message));
用 async/await 提升可读性
配合 async/await 写出接近同步逻辑的代码,更易维护:
async function runOrderFlow(orderId) {
try {
await transition('created', 'paid', orderId);
await transition('paid', 'shipped', orderId);
await transition('shipped', 'delivered', orderId);
console.log('Order flow completed');
} catch (err) {
console.error('Flow failed:', err.message);
}
}
这样每一步都等前一步 Promise settle 后再执行,天然支持错误冒泡和集中捕获。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










