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});
},
此时进程的情况:
囧
也就是说必须得返回一个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();
},
妥~