gpt4 book ai didi

JavaScript 单例丢失引用

转载 作者:行者123 更新时间:2023-11-30 21:02:49 25 4
gpt4 key购买 nike

我在“program.js”中实现的单例模式有问题:

var Program = (function() {

var _program; // Instance of program

// Constructor
function Program() {

if (typeof _program != "undefined") {
throw new Error("Program can only be instantiated once.");
}

this.run = false; // flag to allow for program exec

_program = this;
};

// Public methods
Program.prototype.init = function() {
// the run call is nested in 4 callbacks
callbackHell (
this.run = true;
);
};

Program.prototype.execute = function() {
if(this.run == true) {
// do stuff
}
};

Program.getProgram = function () {
if(typeof _program == "undefined")
{
return new this();
}
return _program;
};

// Return the constructor
return Program;
})();

在我的“main.js”中,我保留对加载程序的引用并检查运行标志以允许执行。看起来像这样:

var program = null;

function initDemo() {
program = Program.getProgram();
program.init();
runDemo();
};

function runDemo() {
if(program != null && program.run) {
program.execute();
}
requestAnimationFrame(runDemo);
};

如果我在 Chrome 浏览器上执行这段代码,它永远不会到达 main.js 中的 program.execute() 调用。程序的引用将使运行标志保持为假,即使它在 init() 函数中被更改。我在调试器中检查了所有这些。我应该指出,“this.run = true”调用嵌套在 4 个回调中。过了一会儿,我想我可以用 init() 函数更改 main.js 中程序全局引用的运行标志。所以不是'this.run = true',而是'program.run = true'。这有效,循环将运行 execute()。然而,这不是我在 OOP 中使用的样式。这里到底发生了什么?它肯定与回调有关:当我在 init() 的末尾将“this.run = true”从回调中取出时,标志被正确更改,但是在程序执行的错误时间。

最佳答案

可能您在 callbackHell 中的回调正在异步执行某些操作,并且在 program.run 实际设置为 true 之前存在延迟,顺序大概是这样的:

  • 你调用program.init()
  • 您的回调开始工作
  • 你调用了runDemo(),这里的program.runfalse并且它存在
  • 回调完成它们的工作并且 program.run 变为 true

解决方案是让您的runDemo 成为另一个回调,因此您的主要代码将如下所示:

var program = null;

function initDemo() {
program = Program.getProgram();
program.init(runDemo);
};

function runDemo() {
if(program != null) {
program.execute();
}
requestAnimationFrame(runDemo);
};

在这里你根本不需要 program.run 标志,相反你只是从“callbackHell”内部开始你的演示:

Program.prototype.init = function(functionToRun) {
// the run call is nested in 4 callbacks
callbackHell (
functionToRun(); // instead of setting program.run
// we call the specified function
);
};

关于JavaScript 单例丢失引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46950815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com