簡體   English   中英

如何在Machina.js中擴展狀態的功能?

[英]how do I extend a state's functionality in Machina.js?

Machina.js (版本0.3.6)上,如何創建擴展FSM構造函數的實例,其中子FSM和父FSM都定義相同狀態的行為?

這是我的代碼:

var _ = require('lodash');
var machina = require('machina')(_);


var MyFsm = machina.Fsm.extend({
    eventListeners: {
        NoHandler: _.bind(console.log, console, "NoHandler"),
        invalidstate:_.bind(console.log, console, "invalidstate")
    },
    initialState: "start",
    states: {
        start: {
            _onEnter: _.bind(console.log, console, "started"),
            connect: function () {
                console.log(this.id + " is connecting");
                this.transition("done")
            }
        },
        done: {}
    }
});
var fsmExample = new MyFsm({
    id: "fsmExample",
    states: {
        done: {
            _onEnter: _.bind(console.log, console, "completed")
        }
    }
});

fsmExample.handle("connect");

我得到這個錯誤:

...\node_modules\machina\lib\machina.js:149
            if (states[current][inputType] || states[current]["*"] || this
                               ^
TypeError: Cannot read property 'connect' of undefined
    at _.extend.handle (...\node_modules\machina\lib\machina.js:149:36)
    at Object.<anonymous> (...\server.js:81:12)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3

我究竟做錯了什么?

我在最近的PR評論中找到了對此問題的描述:似乎該領域存在已知問題,應該在0.3.7中更好地解決。 在此之前,我已經做出了變通辦法,可以在代碼中管理繼承,並使用默認構造函數而不擴展它:

var _ = require('lodash');
var machina = require('machina')(_);

var myProtoProps = {
    eventListeners: {
        NoHandler: _.bind(console.log, console, "NoHandler"),
        invalidstate: _.bind(console.log, console, "invalidstate")
    },
    initialState: "start",
    states: {
        start: {
            _onEnter: _.bind(console.log, console, "started"),
            connect: function () {
                console.log(this.id + " is connecting");
                this.transition("done")
            }
        },
        done: {}
    }
};
var myChildProps = _.merge(_.cloneDeep(myProtoProps), {
    id: "fsmExample",
    states: {
        done: {
            _onEnter: _.bind(console.log, console, "completed")
        }
    }
});
var fsmExample = new machina.Fsm(myChildProps);

fsmExample.handle("connect");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM