Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对同一URL的多个ajax请求的奇怪行为_Javascript_Ajax_Browser_Browser Cache_Cherrypy - Fatal编程技术网

Javascript 对同一URL的多个ajax请求的奇怪行为

Javascript 对同一URL的多个ajax请求的奇怪行为,javascript,ajax,browser,browser-cache,cherrypy,Javascript,Ajax,Browser,Browser Cache,Cherrypy,我在CherryPy服务器中构建了一个奇怪的场景,我希望得到一些帮助,以了解到底发生了什么,以及为什么。下面是server.py: 进口樱桃 导入操作系统 导入线程 类根对象: 定义初始自我: self.count=0; self.lock=threading.lock @樱桃树 def appself: 使用self.lock: self.count+=1 返回呼叫%d%self.count 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': cherryp

我在CherryPy服务器中构建了一个奇怪的场景,我希望得到一些帮助,以了解到底发生了什么,以及为什么。下面是server.py:

进口樱桃 导入操作系统 导入线程 类根对象: 定义初始自我: self.count=0; self.lock=threading.lock @樱桃树 def appself: 使用self.lock: self.count+=1 返回呼叫%d%self.count 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': cherrypy.quickstartRoot,/,{/:{tools.staticdir.on:True, tools.staticdir.dir:os.getcwd} 这是一个非常简单的应用程序,其某些状态受互斥锁保护。以下是index.html:

HTML可以如此稀疏-请参见下面的is index.js:

我安排go_fast函数向/app/+I发出ajax请求,其中I是循环索引,而不仅仅是/app,通过更改请求和go_fast,如下所示:

function request(i) {
    var cb = function (response) {
        console.log(response);
    };

    $.ajax({
        url: "/app/" + i,
        success: cb
    });
}

function go_fast(N) {
    var i;
    for (i = 0; i < N; i++) {
        request(i);
    }
}
然后我再次得到1到100的行为。相反,如果我修改了要使用的函数,例如,将/app/7作为URL,即将上面代码段中的/app/+I替换为/app/7,我将得到100次重复调用1,如初始示例中所示

在我看来,这很像是缓存了一个也是唯一一个ajax请求的结果,在最初的情况下,我只看到了1100次调用。Chrome控制台中的Network选项卡只显示了一个接收状态代码为200OK的ajax请求,据我所知,您必须在CherryPy中显式启用服务器端缓存。在这种情况下,Firefox提供了预期的行为,这也是一种好奇

在其他情况下,出于这样或那样的原因,这种缓存机制会失败。蹦床可能会导致浏览器丢弃ajax请求的直接上下文,使其无法记住以前曾对同一URL发出过请求,而将URL设计为需要位置参数只会为每个请求提供一个唯一的URL,从而强制发出实际请求,而不是使用任何缓存机制


谁能具体解释一下这里发生了什么事?这仅仅是Chrome如何在短时间内处理许多ajax请求的一个特点吗?或者这种情况是有状态ajax资源的致命问题吗?

我认为这是一种竞争条件,与客户端的cache:false选项相结合,请记住,对象根在线程池中共享

当您修改self.count时,当另一个X请求线程返回您新修改的参数时,它们在with块上的时间为-1,并且没有在这个特定请求上返回新的计数


当修改和退出with语句的请求已经在返回中时,那么决定返回的数字是否重复的是cherrypy线程池的处理吞吐量

重要的部分可能是您如何修改go_fast以向/app+i发出Ajax请求:您可以添加它吗?尝试将cache:false添加到Ajax选项中。@minitech,添加了修改。如果您需要更多详细信息,请告诉我@Barmar,奇怪的是,当我在选项中添加cache:false时,我现在会得到一组、两组或三组,有时甚至四组的重复消息。也就是说,我可能会接到电话27,然后接两个电话28,然后接三个电话29。我还必须修改服务器中的app方法以接受关键字dict arguments您的返回调用%d%self.count不在锁定块内…有点不利于锁定。我想这是第一种情况下你的问题,但第二种情况我不确定。
@cherrypy.expose
def app(self, i):
    with self.lock:
        self.count += 1
    return "Call #%d" % (self.count)
function request(i) {
    var cb = function (response) {
        console.log(response);
    };

    $.ajax({
        url: "/app/" + i,
        success: cb
    });
}

function go_fast(N) {
    var i;
    for (i = 0; i < N; i++) {
        request(i);
    }
}