gpt4 book ai didi

javascript - CoffeeScript 范围问题

转载 作者:数据小太阳 更新时间:2023-10-29 06:03:34 24 4
gpt4 key购买 nike

我在这里做错了什么?我正在使用粗箭头 => 进行回调,但是当代码到达 cb.onEndElement 并调用 @returner 时,我得到一个空对象异常。那么为什么@returner 不存在呢?

class Parser
constructor: () ->
@returner = (data) ->

searchParser: new xml.SaxParser (cb) =>
cb.onStartElementNS (elem, attrs, prefix, url, ns) =>
if elem is "results" then @results = []
else if elem is "title" then @curr = "title"
else @curr = "none"
cb.onCdata (cdata) =>
if @curr is "title" then @book.title = cdata
cb.onEndElementNS (elem, prefix, url) =>
@results.push @book if elem is "book"
cb.onEndDocument =>
@returner @results

search: (str, callback) ->
@returner = callback
@searchParser.parseString str

p = new Parser
p.search "somexml", (data) ->
console.log JSON.stringify data

最佳答案

您的方法 search 需要一个粗箭头 => 才能将其绑定(bind)到 Parser 的实例。

此外,虽然行 searchParser: new xml.SaxParser (cb) => 编译,它可能没有做你想做的,因为粗箭头将回调绑定(bind)到 Parser 而不是 this。您有两个选择:

  1. 您可能应该将 @searchParser = new xml.SaxParser (cb) => ... 放在您的构造函数中,考虑到您调用它的方式。
  2. 否则你可以使用 searchParser: () => new xml.SaxParser (cb) => 并用括号调用它:@searchParser().parseString str,这将创建一个绑定(bind)到 this
  3. searchParser 方法

例如,这里是我的两个解决方案,以及您的原始行,稍微简化,以及编译后的代码,用于比较和对比:

CoffeeScript 中的简化示例:

class Parser
constructor: () -> @searchParser1 = new xml.SaxParser (x) => console.log(x)
searchParser2: () => new xml.SaxParser (x) => console.log(x)
searchParser: new xml.SaxParser (x) => console.log(x)

编译的 JavaScript:

var Parser;
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
Parser = (function() {
function Parser() {
this.searchParser2 = __bind(this.searchParser2, this);
this.searchParser1 = new xml.SaxParser(__bind(function(x) {
return console.log(x);
}, this));
}
Parser.prototype.searchParser2 = function() {
return new xml.SaxParser(__bind(function(x) {
return console.log(x);
}, this));
};
Parser.prototype.searchParser = new xml.SaxParser(__bind(function(x) {
return console.log(x);
}, Parser));
return Parser;
}).call(this);

注意 searchParser1searchParser2 如何将它们的回调绑定(bind)到 thissearchParser 是如何绑定(bind)到 解析器

一如既往,CoffeeScript 主页 (http://jashkenas.github.com/coffee-script/) 上的“试用 CoffeeScript”按钮是您的好 helper !

关于javascript - CoffeeScript 范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038845/

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