1

我有以下方法来使用 coffeescript/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

我正在 Jasmine 中测试它:

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

但 Jasmine 吐出的却是:

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/coffeescript/ajax 等弄湿了,不明白 Jasmines 的反应。如果需要更多信息,请告诉我谢谢!

4

1 回答 1

2

您的问题是您的return方法不会返回您认为的结果。您的return函数返回返回的内容getJSON并且getJSON是 AJAX 调用。jQuery 的 AJAX 调用所有 return jqXHRs,这与 AJAX 回调返回的内容无关。事件顺序如下所示:

  1. 你打电话JsonParser.return
  2. return来电$.getJSON
  3. getJSON对服务器进行异步调用,然后返回一个jqXHR.
  4. return返回相同jqXHRgetJSON返回值。
  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.
)

现在你有了一些应该工作的东西,你可以在这里找到如何使用 Jasmine:

如何使用 Jasmine 验证 jQuery AJAX 事件?

于 2013-04-25T18:04:51.180 回答