在使用javascript-state-machine状态机调用异步钩子函数时,卡死问题及抛出异常问题
来源:互联网 发布:唐努乌梁海 知乎 编辑:程序博客网 时间:2024/06/03 05:09
2017-03-16:更新
使用外面包裹一层async函数的方式难以抛出异常,而且很丑陋。
经过艰苦的摸索(妈蛋,新版的文档也补全),终于找到了一个抛出异常的方式。
这是钩子函数中,大致思路就是代码中抛出错误,然后抓取到后用reject向调用函数返回一个异常实例。
注意一定要resolve,不然会卡死。
onBeforeTransition: function (action, t) { return new Promise(async (resolve, reject)=> { try { console.log('action.transition: ',action.transition); switch (action.transition){ //检查提交人是否为创建人 case operation.submit: if (this.req.user.id !== this.order.createdUsr) throw new Error(301); resolve(); break; default: console.log('default:'); resolve(); } }catch(err){ reject(err) } }); },
在调用函数处的使用,抓取到返回值,无论是resolve还是reject,都会以这个方式返回值。
然后判断该实例是否为异常的实例,如果是则抛出。(Object.getType方法)
最后在最外层的catch中可以获取到这个错误。
let err = await fsm[action](t, args.accountId); if(Object.getType(err) === 'error') throw err;
真累。
比普通的抛出错误多了两层,第一是钩子函数中需要catch,然后reject;第二层是调用函数需要手动判断是否为异常类型。
好傻,同样也丑陋。
*******************************分割线************************************
最近项目中需要用到审批流程,由于工作流引擎比较大,于是整了个状态机。
找来找去,发现新版的javascript-state-machine 简单好用文档全,于是开干了。(注意不要用老版的,老版文档少,功能简单;不过如果只是前端用于控制页面的状态变化倒也可以用)
但是在使用钩子函数时,测试时发现只要用上async、await就会卡住,不往下走了。
例:
onAfterCreate: async function (action, t) { let createLog = { <属性> }; console.log(this.state); console.log('222222222222222222222222222222'); return await models.log.create(createLog, {transaction: t}); },
此时进程的情况:
然后跑去看文档,发现文档说
Be sure that you always resolve (or reject) your Promise eventually, otherwise the state machine will be stuck forever within that pending transition.
囧
也就是说必须得返回一个promise对象,而await只是返回一个resolve的值,所以需要在这一层外面再包裹一个async函数,成为一个promise对象。
修改后就成功了。
onAfterCreate: async function (action, t) { let run = async ()=>{ let createLog = { <属性> }; console.log(this.state); console.log('222222222222222222222222222222'); return await models.log.create(createLog, {transaction: t}); }; run(); },
妥~
- 在使用javascript-state-machine状态机调用异步钩子函数时,卡死问题及抛出异常问题
- 关于WF4 State Machine 状态机工作流的发布问题.
- 解决在JBoss上跨IP调用EJB时抛出CommunicationException异常的问题!!!
- 在继承中重写方法时抛出异常的问题
- 在继承中重写方法时抛出异常的问题
- 在继承中重写方法时抛出异常的问题
- 在继承中重写方法时抛出异常的问题
- 在继承中重写方法时抛出异常的问题
- 在继承中重写方法时抛出异常的问题
- 线程异常抛出问题
- 状态机(The State Machine Framework)
- 关于状态机 finite-state machine
- Mina State machine状态机讲解
- 复制状态机(State Machine Replication)
- 构造函数、析构函数抛出异常的问题
- 构造函数、析构函数抛出异常的问题
- 构造函数、析构函数抛出异常的问题
- 构造函数、析构函数抛出异常的问题
- ArrayList、Vector以及LinkList的区别
- 关于目录、文件的一些操作
- extjs教程收集
- 开通博客随心记
- FishC笔记—16 讲 序列,序列
- 在使用javascript-state-machine状态机调用异步钩子函数时,卡死问题及抛出异常问题
- py json处理
- 2017年1月前端面试记
- 大整数运算(高精度运算)
- linux中的系统调用机制
- 快速搭建好一个项目,你必须掌握这两步
- 【HDU4348】To The Moon-主席树(可持久化线段树)区间修改+区间询问
- Java SSM 商户管理系统 客户管理 库存管理 销售报表 项目源码
- 远程通讯____webservice简单例子摘抄IBM