Coffeescript从回调方法获得适当的范围

时间:2012-04-01 05:22:54

标签: jquery scope coffeescript javascript

我已经搜索过这个并且似乎无法找到成功的答案,我正在使用jQuery ajax调用而我无法获得回调的响应。

这是我的coffeescript代码:

initialize: (@blog, @posts) ->
    _url = @blog.url
    _simpleName = _url.substr 7, _url.length
    _avatarURL = exports.tumblrURL + _simpleName + 'avatar/128'
    $.ajax
        url: _avatarURL
        dataType: "jsonp"
        jsonp: "jsonp"
        (data, status) => handleData(data)

handleData: (data) =>
    console.log data
    @avatar = data

这是编译好的JS:

  Blog.prototype.initialize = function(blog, posts) {
    var _avatarURL, _simpleName, _url,
      _this = this;
    this.blog = blog;
    this.posts = posts;
    _url = this.blog.url;
    _simpleName = _url.substr(7, _url.length);
    _avatarURL = exports.tumblrURL + _simpleName + 'avatar/128';
    return $.ajax({
      url: _avatarURL,
      dataType: "jsonp",
      jsonp: "jsonp"
    }, function(data, status) {
      return handleData(data);
    });
  };

  Blog.prototype.handleData = function(data) {
    console.log(data);
    return this.avatar = data;
  };

我已经尝试了十几种变体,我无法弄清楚如何写这个?

感谢。

2 个答案:

答案 0 :(得分:2)

由于handleData位于Blog的原型中,而不是范围内的变量,您可能需要这样:

(data, status) => @handleData(data)

答案 1 :(得分:2)

您的参数不正确,您将回调作为第二个参数传递给$.ajax。您应该在选项中将其作为success:传递,或将其添加到Ajax延迟对象。

由于handleData看起来像是附加到一个可能为this的对象,因此您需要在其前面添加@

虽然您传递URL的方式有效,但API现在建议将URL作为第一个参数传递,将选项作为第二个参数传递。

$.ajax _avatarURL,
  dataType: "jsonp"
  jsonp: "jsonp"
  success: (data, status) => @handleData(data)

OR

$.ajax _avatarURL,
  dataType: "jsonp"
  jsonp: "jsonp"
.done (data) => @handleData(data)