在使用javascript-state-machine状态机调用异步钩子函数时,卡死问题及抛出异常问题

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值