【问题标题】:Jquery ajax done callback not responding to 201jQuery ajax 完成回调没有响应 201
【发布时间】:2013-02-05 23:23:24
【问题描述】:

我有一个这样的 ajax 帖子:

$.post("/api/v1/payment_methods/create_credit_card", values)
.done (response) ->
  console.log("GOOD JOB")
.fail (response) ->
  console.log("Adas")

响应是 201,但是,done 似乎没有捕获它,而是会失败。我认为 201 会被认为是成功的,并且会被 done 捕获。关于它为什么不起作用的任何想法?

注意:上面的代码在coffeescript中,这并没有真正影响问题,但解释了我的语法

【问题讨论】:

  • 好吧,我最初并不是自己发送的。我发布到的 api 将发送回一个字符串,如果它是一个成功捆绑为 201 的字符串。那么手动返回 200 是不是更好的形式?
  • 改成200还能用吗?
  • 我试了200个还是不行。 ajax 中的状态检查将其选中,但仍然失败

标签: jquery coffeescript jquery-deferred


【解决方案1】:

所以我们找出了问题所在,JSON.parse 抛出了一个语法错误——因此发送的值不是有效的 JSON 格式。发帖人无法在 chrome 中看到语法错误,但 firebug 显示了该错误。

这表明每当 Javascript 抛出异常时,响应可能仍然是 200、201、202 等 - 但由于语法错误,会触发 fail() 函数。

EDIT - 你也应该使用不同的响应,很多人使用 200 - OK,但我建议在这种情况下使用 202 - ACCEPTED。

【讨论】:

  • 对不起,我忘了说我上面的代码在 Coffeescript 中
  • 我尝试将其更改为返回 202 但失败似乎仍然捕获它
  • 你用过firebug并查看了响应吗?
  • 是的,我正在 chrome 开发者工具中查看响应。调用 response.status 返回 202(是 201,但我根据之前的 cmets 更改了它)并且 response.statusText 为“已接受”。
  • 你确定这不是将 coffescript 编译成 javascript 时出现的问题吗?为了以防万一,可能想尝试直接的javascript。
【解决方案2】:

查看源代码,成功应该在 200 - 300 和 304 之间触发。另一种方法是显式调用 statusCode:

$.ajax({
  statusCode: {
    201: function() {
      console.log("HERE");
    }
  }
});

【讨论】:

  • 我可以手动检查特定的状态码,但我想使用 done 方法检查所有成功。有什么理由为什么 done 不会为 201 或 202 触发?
  • 就像我说的,根据来源看来 done 应该捕获它。我只是建议 statusCode 回调,看看是否正确捕获它。
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多