javascript - Javascript 类不是构造函数
问题描述
我有一个状态机,我正在其中进行转换以从一种状态移动到另一种状态。(例如 ReserveState -> StartState)
在这种特殊情况下,我从 ReserveFailedVMState 过渡到 ReserveVMState
ReserveFailedVMState 的代码:
const { AbstractVMCtrlState } = require("./AbstractVMCtrlState");
const { ReserveVMState } = require("./ReserveVMState");
const { TerminateDuringReservationState } = require("./TerminateDuringReservationState");
const { ResourceUnavailableState } = require("./ResourceUnavailableState");
//>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
//###START_CUSTOMCODE1
const { Config } = require("../config/Config");
const { Tasker } = require("../libs/tasker/src/Tasker");
//###END_CUSTOMCODE1
class ReserveVMFailedState extends AbstractVMCtrlState {
//>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
//###START_CUSTOMCODE2
async onEnterState() {
//TODO: try to remove the reservation, if exists
this.logMsg("Could not reserve a VM");
const config = Config.getConfig();
if (this.SM.getQueueReservationRetries() <= config.queueReservation.requeueReservationMaxRetries) {
this.logMsg("Retrying queue for Starting a Reservation, attempt # " + this.SM.getQueueReservationRetries());
this.SM.setIncreaseQueueReservationRetries();
await this.retryReserveVMCloudTask();
} else {
this.logMsg("After maxRetries, reservation could not be done");
await this.SM.resourceUnavailable();
}
}
// kicking off a cloud task for retrying to reserve a VM
async retryReserveVMCloudTask() {
const run_id = this.getRunId();
const tasker = new Tasker();
const vmStartTaskId = await tasker.sendRetryReserveVM(run_id);
this.SM.setVmStartTaskId(vmStartTaskId);
}
//###END_CUSTOMCODE2
constructor() {
super();
}
async onExitState() {}
reserveVM() {
this.logMsg("holaaaaa");
return new ReserveVMState();
}
terminateRequested() {
return new TerminateDuringReservationState();
}
resourceUnavailable() {
return new ResourceUnavailableState();
}
}
const serialijse = require("serialijse");
serialijse.declarePersistable(ReserveVMFailedState);
module.exports = { ReserveVMFailedState };
其中 retryReserveVMCloudTask 函数启动一个转换以再次移动到 ReserveVMState
ReserveVMState 的代码:
const { AbstractVMCtrlState } = require("./AbstractVMCtrlState");
const { WaitForReservationReadyState } = require("./WaitForReservationReadyState");
const { TerminateDuringReservationState } = require("./TerminateDuringReservationState");
const { ReserveVMFailedState } = require("./ReserveVMFailedState");
//>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
//###START_CUSTOMCODE1
const { reserveVM } = require("./vm-reservation/reserveVM");
//###END_CUSTOMCODE1
class ReserveVMState extends AbstractVMCtrlState {
//>>>> don't change the CUSTOM CODE comments, if you do generation will overwrite your code >>>>
//###START_CUSTOMCODE2
async onEnterState() {
// todo later djs fix retries and allow to try on other zones
this.SM.setCurrentVMZone("europe-west4-b");
// queue a VM reservation on the GPC cloud
const run_id = this.getRunId();
const vmZone = this.SM.getCurrentVMZone();
const resName = this.getReservationName();
try {
await reserveVM(run_id, resName, vmZone, "gcp", this.logMsg);
this.logMsg(`Reservation successful: ${resName} `);
await this.SM.waitForReservationReady();
} catch (e) {
console.error(JSON.stringify(e));
this.logMsg(`Reserve VM exception: ${e.name}: ${e.message}`);
await this.SM.reserveVMFailed();
}
}
//###END_CUSTOMCODE2
constructor() {
super();
}
async onExitState() {
}
waitForReservationReady() {
return new WaitForReservationReadyState();
}
terminateRequested() {
return new TerminateDuringReservationState();
}
reserveVMFailed() {
return new ReserveVMFailedState();
}
}
const serialijse = require("serialijse");
serialijse.declarePersistable(ReserveVMState);
module.exports = { ReserveVMState };
我实现了一个记录器,当我尝试这种转换时,我收到以下错误:
[OSM] 5f64cae6df60d0c4734aa87b - OSM 异常:TypeError:ReserveVMState 不是构造函数
我尝试了不同的方法,但似乎都没有奏效,我在这里错过了什么?
提前致谢
解决方案
通过 console.log 上的提示,我意识到我的 ReserveVMState 是未定义的,这有点奇怪。经过调查,问题是由于 NodeJs “require”,node.js require() 缓存 - 可能无效?我将此链接用作帮助,我的最终解决方案是将 ReserveVMFailedState 上的“要求”更改为此
const { ReserveVMState } = requireUncached("./ReserveVMState");
上面的链接中提供了 requireUncached 函数。
推荐阅读
- python - 我可以为按钮创建随机 x 和 y 坐标 - Tkinter Python
- cookies - sg-cookie-optin 扩展抛出没有名为 SGalinski\SgCookieOptin\Hook\LicenceCheckHook 的类
- javascript - Javascript中的密码验证
- openedge - 为什么我可以在浏览器中对列进行排序?
- jenkins - Jenkins - shell 脚本 - 发现参数格式不正确
- three.js - 如何将 TransformControls 附加到 Three.JS 中自己的网格组中心?
- shell - 源文件移动到 unix 中的存档文件夹
- c# - 卡巴斯基将 C# 应用程序检测为特洛伊木马病毒 (VHO:Trojan.MSIL.Convagent.gen)
- python - 使用 webbrowser 而不是 Selenium
- c++ - 具有先前模板参数类型的自动返回类型实参的函数类型的模板参数