Ajax 在异步线程中播放Framework 1.2.4同步作业:可能吗?

Ajax 在异步线程中播放Framework 1.2.4同步作业:可能吗?,ajax,multithreading,asynchronous,playframework,playframework-1.x,Ajax,Multithreading,Asynchronous,Playframework,Playframework 1.x,我正在从事一个严重依赖于主用户页面上的ajax请求的项目 在当前网页中,我有n个相同的视图,每个视图都有ajax请求。因此,当用户加载页面时,会同时运行n个ajax请求 还有另一个设计问题,在第一个请求运行后,其他请求将从tha缓存收集数据。以下是工作流程: 请求: 发送请求 检查缓存是否具有所需的值 如果不可用,则从以下Web服务器收集数据: 需要一些时间 收集数据,将x分钟的值写入缓存。 返回值 . 因此,如果我能够在开始时只运行一个请求,并让其他请求等待第一个请求完成,那么它们将能够使用

我正在从事一个严重依赖于主用户页面上的ajax请求的项目

在当前网页中,我有n个相同的视图,每个视图都有ajax请求。因此,当用户加载页面时,会同时运行n个ajax请求

还有另一个设计问题,在第一个请求运行后,其他请求将从tha缓存收集数据。以下是工作流程:

请求:

发送请求 检查缓存是否具有所需的值 如果不可用,则从以下Web服务器收集数据: 需要一些时间 收集数据,将x分钟的值写入缓存。 返回值 . 因此,如果我能够在开始时只运行一个请求,并让其他请求等待第一个请求完成,那么它们将能够使用缓存中可用的数据,这将大大提高性能

问题是播放并异步运行所有作业,因此这些请求在第一页加载时不会看到缓存值

所以我需要做的是:

----Main ASYNC Thread------
-------first View Request----
-------second Request (it will run after the first one so it will read from the cache---
----- and so on...
那个么,我怎样才能将请求放入队列中,或者怎样才能让其他请求等待呢

我知道我应该为此设计应用程序,但页面设计和javascript设计来自外部源。所以我没有时间去做那些事情


感谢您的帮助。

如果您将数据加载逻辑封装在一个方法中,则可以同步该方法中的所有线程,例如使用AtomicBoolean标志

private final AtomicBoolean initialised = new AtomicBoolean(false);

public Data getData() {
   Data data = null;
   if (!initialised.get() && initialised.compareAndSet(false, true)) {
     cache.put(loadData());
   }
   while ((data = cache.get()) == null);
   return data;
}

只有一种方法。

我通过两种方法解决了这个问题,首先我意识到有一种叫做jquery.queue的方法,所以我能够对ajax请求进行排队,然后我将逻辑改为在第一个请求上计算并缓存所需的值,其他人只查看缓存的值。逻辑就像查找未找到的缓存查找未找到的数据库在队列的帮助下执行计算首先缓存一个,其他人从缓存中获取数据。顺便说一句,AtomicBoolean刚刚超出我的知识水平,感谢分享此信息,我接受你的回答,因为我也像你说的那样,以某种方式封装了数据加载逻辑。。谢谢SNP。但是,如果您缓存的数据在多个用户/会话之间共享,或者(比如)在浏览器会话中从两个不同的选项卡发送类似的请求,那么在这种情况下,您仍然会遇到最初的问题。这是因为将为每个加载的页面创建多个jqery队列。因此,服务器端的一些同步机制可能对解决您的问题至关重要。感谢您提供的信息,我已更新了我的应用程序,以便只有一个作业负责计算,并且我已将其他控制器与计算作业隔离。此外,我还为job添加了一个模型,以查看是否有另一个线程运行所需的job,等等。。在一般情况下,使用异步作业非常困难。