在使用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();    },

妥~

0 0
原创粉丝点击