运行回调时失去对JS类中的函数的访问权限

时间:2017-01-15 15:58:16

标签: javascript class tvml tvjs

我正在开发一个TVML / TVJS应用程序,并且在使用Javascript中的类时遇到了一个问题。

我的启动application.js文件调用函数

printChar

我有一个名为ResourceLoader.js的单独文件,其中包含以下内容:

resourceLoader = new ResourceLoader();
resourceLoader.getHomeScreen();

(BASEURL是application.js中定义的全局变量)

一切都很好。调用getHomeScreen(),它设法调用getRemoteJSON()并传递_jsonLoaded()作为回调。 getRemoteJSON执行AJAX调用,然后运行回调。这就是问题发生的地方。一旦进入_jsonLoaded,“this”就变得未定义,所以当我调用this.getRemoteXMLFile时,我收到错误消息“undefined不是对象(评估'this.getRemoteXMLFile')”

为什么“this”在getHomeScreen()中工作但在_jsonLoaded()中没有?如何从_jsonLoaded()?

访问我的getRemoteXMLFile函数

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这是因为回调不是一个功能。

一个好的解决方案是使用ES6 Promises。

以下是使用带有Promise的AJAX获取数据的示例

val props = BasicRepositoryProvider.getProperties("./graph.jnl")
val sail = new BigdataSail(props)
val repo = new BigdataSailRepository(sail)

repo.initialize()

val query = "SELECT ?p ?o WHERE { <http://github.com/jschmidt10#person_Thomas> ?p ?o }"
val cxn = repo.getConnection
cxn.begin()
var res = cxn.
    prepareTupleQuery(QueryLanguage.SPARQL, query).
    evaluate()

while (res.hasNext) println(res.next)
cxn.close()
repo.shutDown()

如何称呼它

getJson(url) {
    return new Promise(
        (resolve, reject) => {
            this.get(url).then(
                (value) => {
                    resolve(JSON.parse(value));
                },
                function (reason) {
                    console.error(reason);
                    reject(new Error(reason));
                }
            )
        }
    )
}

答案 1 :(得分:0)

  

为什么&#34;这&#34;在getHomeScreen()中工作但不在_jsonLoaded()中工作?如何从_jsonLoaded()?

访问我的getRemoteXMLFile函数

它在技术上并不特定于TVML应用程序,而是更多的一般JS问题,所以让我根据JavaScript回答this(没有双关语意)。

当您调用getHomeScreen时,您在对象实例resourceLoader.getHomeScreen()上调用它,因此保留了this上下文。但是,当您将_jsonLoaded函数作为函数的回调参数传递并执行callback(template, xhr.responseText)时,对象上下文将丢失。

最近为具有纯OOP语言背景的人引入了JavaScript class关键字might be confusing,因为它不是面向对象的继承,而只是古老原型继承的语法糖在JavaScript中。因此,如果一个人碰巧属于同一个群体,那么理解差异和gotchas是明智的。

话虽如此,当您将函数作为回调传递时,对您的直接问题陈述的一个直接且简单的解决方案是bind this上下文。

this.getRemoteJSON(homeData, homeTemplate, this._jsonLoaded.bind(this));

旁注:您是否尝试过构建TVML应用的atvjs框架?它可以让您在没有太多噪音的情况下构建和快速构建应用程序原型,从而抽象出传统TVML应用程序的潜在麻烦和复杂性。