2013-04-25 31 views
1

我有以下方法使用加载一个JSON文件的CoffeeScript/jQuery的:茉莉花和jQuery,加载JSON文件

Class JsonParser 

this.return = (json_file_path, string_to_query) -> 
    $.getJSON json_file_path, (data) -> 
    $.each data, (key,val) -> 
    if key == string_to_query 
     return val 

但我是测试它在茉莉花:

expect(JsonParser.return("file.json", "key").toEqual("value") 

但什么茉莉花吐出的却是:

Expected { readyState : 1, getResponseHeader : Function, getAllResponseHeaders 
: Function, setRequestHeader : Function, overrideMimeType : Function, statusCode : Function, abort : 
Function, state : Function, always : Function, then : Function, promise : Function, pipe : Function, d 
one : Function, fail : Function, progress : Function, complete : Function, success : Function, error : 
Function } to equal 'value'. 

假设JSON文件只有一个行:{ "key": "value" }

我只是让我的脚湿jQuery /咖啡/阿贾克斯等,不明白茉莉的反应。请让我知道是否需要更多信息,谢谢!

回答

2

您的问题是您的return方法不会返回您认为它的作用。您的return函数返回getJSON返回的内容,而getJSON是AJAX调用。 jQuery的AJAX调用全部返回jqXHRs,这与AJAX回调函数返回的内容无关。事件的顺序如下所示:

  1. 您致电JsonParser.return
  2. return来电$.getJSON
  3. getJSON对服务器进行异步调用,然后返回jqXHR
  4. return返回返回的相同jqXHR
  5. 过了一段时间。
  6. 服务器开始响应并调用回调来搜索JSON。

的问题是,虽然(5)正在发生的事情,那个叫JsonParser.return代码仍在继续,但它没有JSON。

通常的方式得到解决的AJAX调用异步性是一个回调函数来发送将被调用时,一些准备:

@return: (json_file_path, string_to_query, callback) -> 
    $.getJSON json_file_path, (data) -> 
    $.each data, (key,val) -> 
    if key == string_to_query 
     callback(val) 

然后你会使用这样的:

JsonParser.return("file.json", "key", (value) -> 
    # Do whatever needs to be done with value in here. 
) 

现在你有什么,应该工作,你可以找到如何与它在这里使用茉莉花:

How do I verify jQuery AJAX events with Jasmine?

+0

感谢您的回应,我仍然得到相同的结果,我一直使用的json文件路径是本地文件,而不是通过服务器调用,这可能是一个问题吗? – Discorick 2013-04-25 18:48:25

+0

@Discorick:你不能在没有服务器的情况下做AJAX,也不能使用普通的Jasmine技术来测试AJAX。 – 2013-04-25 19:01:50

+0

好吧,我明白了,谢谢你的帖子真的很有帮助! – Discorick 2013-04-25 21:32:44