【问题标题】:calling jQuery.ajax consecutively results in single callback连续调用 jQuery.ajax 会导致单个回调
【发布时间】:2013-12-18 21:06:30
【问题描述】:

这是一个有趣的问题。

我正在做一个异步 ajax put

    return $.ajax({
        url: url,
        type: 'PUT',
        contentType: 'application/json; charset=utf-8',
        async: true, // default
        success: function (result, textStatus, xhr) {...}

这按预期工作,除非用户在上一个调用返回之前执行 put(即使它是异步的,调用确实需要 0.5 秒才能完成)

如果用户按下按钮几次(执行多次放置),则会发生以下情况:

  • 我在 fiddler 中只看到一个服务器调用
  • 每次点击都会触发成功
  • 所有回调都获得相同的新行 ID(由服务器返回)

这使我不可避免地得出结论,即第一个服务器回调会触发所有未完成的回调..

我可以在回调返回之前禁用按钮,但是否可以处理多个未完成的调用?这是浏览器限制吗?最好的方法来处理这个?

更新

作为测试,我切换到使用 POST 而不是 PUT:调整类型:JS 端的“POST”和 Web api(服务器端)的 [HttpPost]。

行为没有改变。

更新

查看this one.. 之类的帖子,这确实应该有效。我看不出其他并发请求没有发送到服务器的任何具体原因。

【问题讨论】:

  • 试试cache:false 可能有缓存在起作用,这就是为什么你只看到一个fiddler响应。
  • 浏览器是否认为它发出了不同的请求?
  • 浏览器也只看到了一个 put 。我尝试设置 cache:false ,但到目前为止没有看到上述行为有任何区别。
  • 你需要向我们展示整个函数,为什么你要返回承诺,以及你对结果做了什么,因为这通常不是问题,PUT、DELETE 或 GET 和 POST 都不是.
  • 但我可以在 fiddler 中看到只有一个请求正在发出.. 除非我等待第一个调用完成.. 然后我会在 fiddler 中看到下一个请求。

标签: javascript jquery ajax


【解决方案1】:

您不能等待 javascript 中的异步回调。您必须根据来自实际回调的异步响应来重组代码以完成所有未来的工作。

如果您需要进行多个连续的 ajax 调用,则发出第一​​个,然后在第一个 ajax 调用的成功处理程序或响应处理程序中,发出第二个 ajax 调用,并在第二个的响应处理程序中,您对数据做任何你想做的事情

【讨论】:

  • 嗨,这是我观察到的,想了解一下限制或设计意图是什么,这使我无法连续拨打多个电话
【解决方案2】:

PUT 请求不应该是幂等的吗?也就是说,提交多个请求应该生成相同的响应吗?如果是这样,代码可能只是试图合并相同的 PUT 请求,因为它们都应该得到相同的结果。如果您为每个帖子增加一些 ID(即更改服务器状态),那么您应该使用 POST 而不是 PUT。

这可能无法解决您的问题;这只是一个想法。

【讨论】:

  • HTTP/1.1 没有定义 PUT 方法如何影响源服务器的状态。没有关于 PUT 是幂等的,实际上通常情况并非如此,我不知道为什么会这样。
  • @BenjaminGruenbaum 参见w3.org/Protocols/rfc2616/rfc2616-sec9.html 第 9.1.2 节
  • 就我而言,我正在使用 put 来创建新记录。服务器返回新行的 id。为此使用 put 是不好的做法吗?
  • @JesseBunch 我回复的第一句话来自第 9.6 节。在 OP 的情况下,我们不知道请求是否按顺序出现,或者中间是否有/可能有其他请求。尽管如此,我对我所做的声明仍然是正确的 - 现在我再次阅读它时措辞不好。
  • 另外,让我重申一下,当调用不重叠时,多次调用 put 按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多