【问题标题】:Multiple AJAX posts to Web Service that returns value. Should I synchronize?多个 AJAX 发布到返回值的 Web 服务。我应该同步吗?
【发布时间】:2012-07-15 10:05:32
【问题描述】:

我的网站正在向我的网络服务发送 ajax 帖子,作为回报,网络服务将返回一个 json,该 json 将在成功回调中进一步使用。

现在,这是我的问题,当我的网站发送多个 ajax 帖子时,Web 服务返回的那些 json 似乎混乱了。

我正在考虑同步 ajax 帖子或网络服务 (REST)?我读到您不需要同步 REST 服务,是这样吗?如果同步是解决方案,我应该在哪里同步它? ajax 中的 async: false 会同步帖子吗?

谢谢。

我考虑过包含一些代码:

网络服务:

@POST
@Override
@Produces("application/json")
@Consumes("application/json")
public Customer create(Customer cust){
    custManager.save(cust);
    return custManager.getCust(custManager.getCount());
}

AJAX:

$.ajax({
  url:  custURL,
  type: 'POST',
  data: JSON.stringify(sdata),
  dataType: 'json',
  contentType: 'application/json; charset=utf-8',
  success: function(json){
     var cust = JSON.parse(JSON.stringify(json));
     var newId = cust.id;
     updateCustId(oldId, newId);
  }
});

它所做的是将客户的数据发布到 Web 服务,Web 服务为其指定一个 id 并将其返回给客户端以更新其客户 id。不仅如此,我还将引用旧客户 ID 的其他表更新为从服务器生成的新表,并且在更新这些其他表之后,它也将被发送到 Web 服务。我说的表是 web sql,它的查询也是异步工作的。所以最终结果是有时 id 被弄乱了,其他表被发送到 web 服务,但它使用的 customerid 仍然是旧的(我使用了回调,确保在发送之前需要先更新它到服务器)。

让我的 ajax 调用 async: false 以使它们同步并且不会混在一起工作。

【问题讨论】:

    标签: ajax rest posts synchronize


    【解决方案1】:

    我不认为你的问题是异步的,特别是。听起来您的 Web 服务实现中有一些错误。您所描述的应该可以正常工作。

    多个 Ajax 请求是完全独立的。后端服务器应分别处理每个请求。

    您可能在网络应用程序的线程之间共享数据时遇到问题,这会导致同时访问相同数据时出现问题。如果是这样,这就是要解决的问题,并且(在最坏的情况下),只需在一小部分进行交叉污染的代码周围放置一个互斥锁。

    如果您发现数据可以正常离开服务器,但在您的应用程序中已损坏,那么问题就出在那儿。

    我强烈建议不要尝试通过使整个应用程序同步来掩盖听起来像是重大后端错误的内容。修复潜在的损坏问题,如果该问题是由无法使线程安全的东西引起的,那么就锁定那一点点。

    您关于 REST 的问题有点无关紧要。无论代码是否需要同步,REST 服务与其他架构都不会改变。当您使用 Ajax 时,您使用的是 HTTP 协议,该协议旨在实现异步和无状态。在我看来,需要客户端同步访问的任何风格的 Web 应用程序都是一个很大的危险信号。

    除了一般建议之外,您还需要询问基于代码的具体问题以了解更多详细信息。

    【讨论】:

    • 嗨,我想到了你说的。当我只发布一个客户时,一切都很完美。事情是这样的,当我发布多个帖子时,有时它可以完美运行,但有时应该返回 json 的服务器返回 null(对于某些客户)。
    • 完全正确 - 我怀疑这是您服务器上线程处理的错误,与 Ajax 或 Javascript 无关。因此,使前端同步只会掩盖您的错误,而不是解决它。您建议的行为非常强烈地表明您不应该尝试修补您的客户端以使错误消失。这就像说当您超过 30 英里/小时时您的汽车发动机会适得其反,因此您正在考虑将油门踏板减半,这样您就不能让它开得那么快。
    • 我听到了。我的服务器是从 netbeans“从数据库创建 web RESTful 服务”向导创建的,我对其进行了一些修改以满足我的需要。您可以在上面的问题中看到我的 Web 服务上的代码。你能建议我如何在每个请求上运行一个线程吗?谢谢
    猜你喜欢
    • 2010-09-11
    • 2017-10-25
    • 2011-03-07
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多