我正在开发一个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函数感谢您的帮助。
答案 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应用程序的潜在麻烦和复杂性。