0

我是 JavaScript 的新手,正在学习 CoffeeScript。我想创建一个在初始化时使用 Ajax与Flickr Web API通信的类。

class Photo

  json: null

  constructor: ->
    @getJson()

  _getJson: (data) ->
    @json = data.photos.photo

  getJson: ->
    $.ajax(
      url : 'http://www.flickr.com/services/rest/'
      type : 'GET'
      data :
        format : 'json'
        method : 'flickr.photos.search'
        api_key : 'api_key'
        user_id : '29242822@N00'
        per_page : '100'
      dataType : 'jsonp'
      jsonp : 'jsoncallback'
      success : @_getJson
    )

我写了一个Jasmine测试来测试类的初始化。

describe("Photo", ->
  photo = new Photo
  console.log(photo.json)
  it("should get json when constructed", ->
    expect(photo.json).toBeDefined()
  )
  it("should have json which begins", ->
    expect(photo.json[0].title).beBe('Ridges of Shirouma')
  )
)

photo.json始终为空。

谢谢你的好意。

4

1 回答 1

1

$.ajax在设置对象的上下文中调用其回调函数:

上下文对象

该对象将成为所有与 Ajax 相关的回调的上下文。默认情况下,上下文是一个对象,表示调用中使用的 ajax 设置($.ajaxSettings与传递给的设置合并$.ajax)。

所以@你的回调中不是你的 Photo 对象,它是一些对你用处不大的设置对象。但是,如果您通过使用胖箭头 ( )_getJson定义它来将您的照片绑定到您的照片:=>

_getJson: (data) =>
  @json = data.photos.photo

然后@将是您的照片,@json最终将成为您正在寻找的东西。

您可能会遇到的下一个问题是,当 Jasmine 尝试查看它是否有效时,您的 AJAX 调用不一定会返回。我对 Jasmine 不太熟悉,但是人们似乎喜欢用 Jasmine 测试 AJAX 的这个答案;还有http://github.com/pivotal/jasmine-ajax用于存根 AJAX 部分以避免异步部分。

于 2012-11-09T06:02:13.857 回答