当前位置: 首页 > 知识库问答 >
问题:

我们如何使用它而不是名为main的globl变量来执行动画循环?

虞滨海
2023-03-14

我有以下代码,其中我想替换animate中的所有主引用,以避免在主类中使用全局变量:

class Main {

    constructor(idDiv) {
        this.div = document.getElementById(idDiv);
        this.sceneManager = new SceneManager(this.div);
    }


    animate() {
        console.log('Main::animate::this', this);
        console.log('Main::animate::main', main);
        requestAnimationFrame(main.animate);
        main.sceneManager.animate();
    }

    execute() {

        new ManageEvents(this.div, this.sceneManager);

        const atla = new Atla();

        const repository = new Repository();

        const loadData = new LoadData(atla, repository);

        loadData.load(this.sceneManager);

        console.log('Main::execute::this', this);
        console.log('Main::execute::main', main);
        this.animate(main.sceneManager);

    }
}


const main = new Main('original');
main.execute();

目前,前面的代码创建了一个动画循环,使用THREEjs动画来渲染场景。

此外,目前的日志包括:

在执行中:

Main::execute::this Main {div: div#original.column, sceneManager: SceneManager}div: div#original.columnsceneManager: SceneManager {div: div#original.column, camera: PerspectiveCamera, scene: Scene, controls: T…E.TrackballControls, renderer: WebGLRenderer}__proto__: Object


Main::execute::main Main {div: div#original.column, sceneManager: SceneManager}

在动画中,首先调用:

Main::animate::this Main {div: div#original.column, sceneManager: SceneManager}

Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}

在动画中,其他人调用:

Main::animate::this null

Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}

正如我们在第一个调用中看到的,在execute和animate函数中,this和main都是相同的。然后在其他调用中,this in animate为null,main stills是main类的实例。我想这是因为这句话:

requestAnimationFrame(main.animate);

我们正在失去这一点。

此外,为了替换我尝试过的主要参考文献:

class Main {

    constructor(idDiv) {
        this.div = document.getElementById(idDiv);
        this.sceneManager = new SceneManager(this.div);
    }


    animate(main) {
        console.log('Main::animate::this', this);
        console.log('Main::animate::main', main);
        requestAnimationFrame(main.animate);
        main.sceneManager.animate();
    }

    execute() {

        new ManageEvents(this.div, this.sceneManager);

        const atla = new Atla();

        const repository = new Repository();

        const loadData = new LoadData(atla, repository);

        loadData.load(this.sceneManager);

        console.log('Main::execute::this', this);
        console.log('Main::execute::main', main);
        this.animate(this);

    }
}


const main = new Main('original');
main.execute();

若要更改传入的参数,以对引用this的当前Main实例进行动画处理。

其结果如下:

第一个电话:

Main::execute::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:34 Main::execute::main Main {div: div#original.column, sceneManager: SceneManager}
Main.js:15 Main::animate::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}

第二个电话:

Main::animate::this null
Main.js:16 Main::animate::main 697.568

Main.js:17 Uncaught TypeError: Failed to execute 'requestAnimationFrame' on 'Window': The callback provided as parameter 1 is not a function.
    at animate (Main.js:17)

我明白这是因为:

    requestAnimationFrame(main.animate);

我们不会再通过我们的主要道路,所以我做到了:

...
        requestAnimationFrame(main.animate(main));
...

然而,它产生了一个无限的循环,我们再也看不到这个场景了。日志还包括:

Main::execute::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:34 Main::execute::main Main {div: div#original.column, sceneManager: SceneManager}
Main.js:15 Main::animate::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}
Main.js:15 Main::animate::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}
Main.js:15 Main::animate::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}
Main.js:15 Main::animate::this Main {div: div#original.column, sceneManager: SceneManager}
Main.js:16 Main::animate::main Main {div: div#original.column, sceneManager: SceneManager}

我也读过:

ES6类:通过对方法应用“addEventListener”访问“this”

如何调用。渲染和动画函数在对象类?

如何在动画循环中创建闭包(保护全局)?

我做错了什么?

你能帮我吗?

共有1个答案

上官兴昌
2023-03-14

您可以绑定动画功能,这样对的引用将始终引用您的对象,而不是请求动画帧的默认窗口上下文。

这里有一个简单的例子:

class Test {
  constructor() {
    this.name = "Window doesn't have this name!"
    this.animate = this.animate.bind(this)
  }

  animate() {
    requestAnimationFrame(this.animate)
    console.log(this.name) // window's "name" property is usually empty or undefined
  }
}

let test = new Test()
test.animate() // look at the console
 类似资料:
  • 我最近在我的机器上安装了nginx和php 7.0.16,但是由于某种原因,nginx下载了php文件,而不是执行它们。我已经花了几天时间在网上实施了所有可用的解决方案,但都是徒劳的。 我的nginx。配置文件是: conf.d文件夹中没有文件,启用的站点只有如下所示的默认文件 有人能告诉我,有什么问题吗?

  • 所以基本上我有一个公共的静态空main方法,它创建一个框架和一个级别,级别是一个面板,然后添加到jframe中,但在代码之后似乎不会检查我在main中的time循环,我知道它没有,因为只要框架是可见的,我的time循环就应该被检查,如果它到达这一点而它没有,它应该在控制台窗口中打印一行。任何帮助都将不胜感激!同样是的,我知道打印行会弹出一个控制台窗口窗口,而不是实际上把它放在框架中,我为此而声明了

  • 我用IntelliJ中的控制台模板创建了一个简单的Kotlin项目,并运行它,我在run-toolwindow中获得了gradle-symbol(参见图片)。 通常我在其他教程中看到有Kotlin符号,所以没有gradle被用来运行Kotlin-Project的主要部分。 是否有可能改变运行Kotlin-main的方式(尽管我查看了运行配置,但没有找到改变“运行环境”的方法) 这更接近,但现在它似

  • 我正在研究一些对象的Flux,比如

  • 问题内容: 我有以下代码可以SSH到节点并从其他设备中找到RSSI。 bot_ipv6是ssh到的ipv6地址的列表,脚本使用pexpect来ssh。 数据现在包含该设备的输出。 我想浏览数据并仅获取地址及其对应的RSSI。当命令可以在本地运行并输出到文件时,此代码有效: 匹配和匹配行是在其中定义的函数,在其他地方则在文件中查找以将字符与所要查找的字符进行匹配。 我的问题是我不知道如何将数据输出到

  • 我正在一个水滴(数字海洋)中安装一个网站。我对正确安装带有PHP的NGINX有一个问题。我做了一个辅导https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04但是当我试着跑的时候。php文件只是下载而已。。。例如<代码>http:/