javascript - Jasmine 和 Jquery,加载一个 JSON 文件

标签 javascript jquery ajax coffeescript jasmine

我有以下方法使用 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 的响应。如果需要更多信息,请告诉我,谢谢!

最佳答案

您的问题是您的return 方法没有返回您认为的结果。您的 return 函数返回 getJSON 的内容返回并且 getJSON 是一个 AJAX 调用。 jQuery 的 AJAX 调用全部返回 jqXHRs这与 AJAX 回调返回的内容无关。事件的顺序看起来像这样:

  1. 您调用 JsonParser.return
  2. return 调用 $.getJSON
  3. getJSON 对服务器进行异步调用,然后返回一个 jqXHR
  4. return 返回与 getJSON 返回的相同的 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.
)

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

How do I verify jQuery AJAX events with Jasmine?

关于javascript - Jasmine 和 Jquery,加载一个 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220315/

相关文章:

javascript - 将受信任的 SSL 证书添加到 Javascript 请求

javascript - 使用严格模式 pragma 时如何声明全局变量

php - Mysql longtext不会保存某些文本?

javascript - 将 google map 自动完成功能与 jquery 自动完成功能集成

javascript - Web 应用程序将 'é' 显示为 �

asp.net - 令人费解的 javascript 数组行为

javascript - 如何在ReactJS中实现带有受控组件的动态表单?

javascript - 我可以将 jstree 复选框限制为只有有 child 的 parent 吗?

javascript - 导航栏 anchor 填充 div,WordPress 菜单

javascript - 在 Express 服务器上获取从 AJAX 发送的数据