连续调用jQuery.ajax会导致单个回调函数。

5

这是一个有趣的问题。

我正在进行异步的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秒才能完成)

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

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

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

我可以禁用按钮,直到回调返回,但处理多个未完成的调用是否可能?这是浏览器的限制吗?最佳处理方法是什么?

更新

作为测试,我切换到使用POST而不是PUT:在JS端调整type:'POST'和在Web API端调整为[HttpPost]。

行为没有改变。

更新

查看像此类帖子.. 这确实应该起作用。我没有看到任何明确的原因,为什么其他并发请求不能传输到服务器。


2
尝试使用 cache:false,有可能是由于缓存机制的原因,你在 Fiddler 中只看到了一个响应。 - Benjamin Gruenbaum
浏览器是否认为它正在进行不同的请求? - Chris Farmer
你需要展示整个函数,为什么要返回 Promise,以及你如何处理结果。因为这通常不是 PUT、DELETE、GET 和 POST 的问题。 - adeneo
但是我可以在 Fiddler 中看到只有一个请求正在进行...除非我等待第一个调用完成...然后我才能在 Fiddler 中看到下一个请求。 - Sonic Soul
你可以设置一个标志来忽略在前一个进程未完成时对按钮的下一次点击,而不是禁用它。 - Lifecube
显示剩余2条评论
2个回答

1
PUT请求不应该是幂等的吗?也就是说,提交多个请求应该生成相同的响应。如果是这样的话,代码可能只是尝试合并相同的PUT请求,因为它们应该都会得到相同的结果。如果您正在为每个帖子递增某个ID(即更改服务器状态),则应使用POST而不是PUT。这可能无法解决您的问题,这只是一种想法。

HTTP/1.1并没有定义PUT方法如何影响源服务器的状态。关于PUT是否幂等并没有明确规定,事实上通常并不是这样,我不知道为什么会有人点赞这个观点。 - Benjamin Gruenbaum
在我的情况下,我使用 put 方法来创建新记录。服务器会返回新行的 ID。这样做是否是不好的实践? - Sonic Soul
@JesseBunch 我回复中的第一句话来自第9.6节。在OP的情况下,我们不知道请求是否按顺序到达或者中间是否有/可能有其他请求。尽管如此,我对我所说的陈述进行了更正 - 现在再次阅读它,发现措辞不够准确。 - Benjamin Gruenbaum
另外,让我再强调一下,当调用不重叠时,多次调用put函数会按预期工作。 - Sonic Soul
@SonicSoul,我建议你阅读一下这篇文章,它详细解释了HTTP动词及其语义:https://dev59.com/QnI-5IYBdhLWcg3wI0t9。在这种情况下,我会使用POST,因为您希望每个请求都创建一个新的记录。 - Jesse Bunch
显示剩余2条评论

0

在JavaScript中,您不能等待异步回调。您必须重构代码,以便基于实际回调的异步响应执行所有未来工作。

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


嗨,这是我观察到的情况,想了解一下限制或设计意图是什么,阻止我进行多个连续调用。 - Sonic Soul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接