javascript-state-machine

import StateMachine from 'javascript-state-machine'
import EventEmitter from 'events'

/**
 * 上传的文档的状态管理
 */

const STATES = {
  NOT_UPLOAD: 'notUpload',
  FILE_TOO_LARGE: 'fileTooLarge',
  UPLOADING: 'uploading',
  UPLOAD_SUCCESS: 'uploadSuccess',
  UPLOAD_ERROR: 'uploadError',
  CONVERTING: 'converting',
  CONVERT_SUCCESS: 'convertSuccess',
  CONVERT_ERROR: 'convertError',
}

const TRANSITIONS = {
  NOT_UPLOAD_TO_FILE_TOO_LARGE: 'notUploadToFileTooLarge',
  NOT_UPLOAD_TO_UPLOADING: 'notUploadToUploading',
  UPLOADING_TO_UPLOAD_SUCCESS: 'uploadingToUploadSuccess',
  UPLOADING_TO_UPLOAD_ERROR: 'uploadingToUploadError',
  UPLOAD_SUCCESS_TO_CONVERTING: 'uploadSuccessToConverting',
  CONVERTING_TO_CONVERT_SUCCESS: 'convertingToConvertSuccess',
  CONVERTING_TO_CONVERT_ERROR: 'convertingToConvertError',
}

class SlideStateManager extends EventEmitter {
  constructor(initState = STATES.NOT_UPLOAD) {
    super()

    this.stateMachine = new StateMachine({
      init: initState,
      transitions: [
        {
          name: TRANSITIONS.NOT_UPLOAD_TO_FILE_TOO_LARGE,
          from: STATES.NOT_UPLOAD,
          to: STATES.FILE_TOO_LARGE,
        },
        {
          name: TRANSITIONS.NOT_UPLOAD_TO_UPLOADING,
          from: STATES.NOT_UPLOAD,
          to: STATES.UPLOADING,
        },
        {
          name: TRANSITIONS.UPLOADING_TO_UPLOAD_SUCCESS,
          from: STATES.UPLOADING,
          to: STATES.UPLOAD_SUCCESS,
        },
        {
          name: TRANSITIONS.UPLOADING_TO_UPLOAD_ERROR,
          from: STATES.UPLOADING,
          to: STATES.UPLOAD_ERROR,
        },
        {
          name: TRANSITIONS.UPLOAD_SUCCESS_TO_CONVERTING,
          from: STATES.UPLOAD_SUCCESS,
          to: STATES.CONVERTING,
        },
        {
          name: TRANSITIONS.CONVERTING_TO_CONVERT_SUCCESS,
          from: STATES.CONVERTING,
          to: STATES.CONVERT_SUCCESS,
        },
        {
          name: TRANSITIONS.CONVERTING_TO_CONVERT_ERROR,
          from: STATES.CONVERTING,
          to: STATES.CONVERT_ERROR,
        },
      ],
      methods: {
        onNotUploadToFileTooLarge: () => {
          this.emit(TRANSITIONS.NOT_UPLOAD_TO_FILE_TOO_LARGE)
        },
        onNotUploadToUploading: () => {
          this.emit(TRANSITIONS.NOT_UPLOAD_TO_UPLOADING)
        },
        onUploadingToUploadSuccess: () => {
          this.emit(TRANSITIONS.UPLOADING_TO_UPLOAD_SUCCESS)
        },
        onUploadingToUploadError: () => {
          this.emit(TRANSITIONS.UPLOADING_TO_UPLOAD_ERROR)
        },
        onUploadSuccessToConverting: () => {
          this.emit(TRANSITIONS.UPLOAD_SUCCESS_TO_CONVERTING)
        },
        onConvertingToConvertSuccess: () => {
          this.emit(TRANSITIONS.CONVERTING_TO_CONVERT_SUCCESS)
        },
        onConvertingToConvertError: () => {
          this.emit(TRANSITIONS.CONVERTING_TO_CONVERT_ERROR)
        },
      },
    })
  }

  stateMachine

  onNotUploadToFileTooLarge = (cb) => {
    this.on(TRANSITIONS.NOT_UPLOAD_TO_FILE_TOO_LARGE, cb)
  }

  onNotUploadToUploading = (cb) => {
    this.on(TRANSITIONS.NOT_UPLOAD_TO_UPLOADING, cb)
  }

  onUploadingToUploadSuccess = (cb) => {
    this.on(TRANSITIONS.UPLOADING_TO_UPLOAD_SUCCESS, cb)
  }

  onUploadingToUploadError = (cb) => {
    this.on(TRANSITIONS.UPLOADING_TO_UPLOAD_ERROR, cb)
  }

  onUploadSuccessToConverting = (cb) => {
    this.on(TRANSITIONS.UPLOAD_SUCCESS_TO_CONVERTING, cb)
  }

  onConvertingToConvertSuccess = (cb) => {
    this.on(TRANSITIONS.CONVERTING_TO_CONVERT_SUCCESS, cb)
  }

  onConvertingToConvertError = (cb) => {
    this.on(TRANSITIONS.CONVERTING_TO_CONVERT_ERROR, cb)
  }
}


export default SlideStateManager
export {
  TRANSITIONS as MACHINE_TRANSITIONS,
  STATES as MACHINE_STATE,
}
原文地址:https://www.cnblogs.com/chenbeibei520/p/11417329.html