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 多个AJAX请求导致的竞争条件_Javascript_Ajax_Xmlhttprequest_Race Condition - Fatal编程技术网

Javascript 多个AJAX请求导致的竞争条件

Javascript 多个AJAX请求导致的竞争条件,javascript,ajax,xmlhttprequest,race-condition,Javascript,Ajax,Xmlhttprequest,Race Condition,我的问题如下。我编写了一个类AJAXEngine,它在构造函数中创建了一个新的XMLHttpRequest对象。该类包含一个名为responseAnalyser的方法,该方法在XMLHttpRequest对象的“onreadystatechange”发生更改时调用。 现在我创建了4个AJAXEngine=>4个XMLHttpRequest对象的实例 现在我有了另一个类DataRequester,它有一个数组属性dataReq,它保存AJAXEngine的实例。整个程序中只有一个DataReque

我的问题如下。我编写了一个类AJAXEngine,它在构造函数中创建了一个新的XMLHttpRequest对象。该类包含一个名为responseAnalyser的方法,该方法在XMLHttpRequest对象的“onreadystatechange”发生更改时调用。 现在我创建了4个AJAXEngine=>4个XMLHttpRequest对象的实例

现在我有了另一个类DataRequester,它有一个数组属性dataReq,它保存AJAXEngine的实例。整个程序中只有一个DataRequester实例! DataRequester有一个名为callWhenFinished的函数。函数被函数调用 响应AJAXEngine的分析器,并递减DataRequester实例的一个变量

但是,我认为有比赛条件。我怎样才能在JavaScript中引用它们

function AJAXEngine
{
 this.httpReqObj = //create new XMLHttpRequest Object
 this.obj;
 this.func;
}
AJAXEngine.prototype.responseAnalyser = function()
{
 if(this.httpReqObj.readState == 4)
 {
  this.func.call(this.obj);
 }
}
AJAXEngine.prototype.fireReq = function(o, f)
{
 this.obj = o;
 this.func = f;
 // fire ajax req
}

function DataRequester()
{
 this.dataReq = new Array();
 this.test = 4;

 for(var i = 0; i < 4; i ++)
 {
  this.dataReq[i] = new AJAXEngine();
 }
}
DataRequester.prototype.callWhenFinished = function()
{
 this.test --;
}
功能AJAXEngine
{
this.httpReqObj=//创建新的XMLHttpRequest对象
这是obj;
这个.func;
}
AJAXEngine.prototype.responseAnalyser=函数()
{
if(this.httpReqObj.readState==4)
{
this.func.call(this.obj);
}
}
AJAXEngine.prototype.fireReq=函数(o,f)
{
这是obj=o;
this.func=f;
//fire ajax请求
}
函数DataRequester()
{
this.dataReq=新数组();
本试验=4;
对于(变量i=0;i<4;i++)
{
this.dataReq[i]=新的AJAXEngine();
}
}
DataRequester.prototype.callWhenFinished=函数()
{
这个测试--;
}

首先:大多数面向AJAX的浏览器都支持“只有两个对同一域的同时请求”的约定。因此,如果您启动4,那么其中2个将被挂起


DataRequeuster/singleton/可以拥有变量“test”的数组,因此,不要在多个实例之间共享单个变量,而是创建多个数据实例。所以,要计算结果,您需要对“test”数组求和

您需要实现一个临时互斥(其思想是,启发式将检查bool并将其设置为true,如果为false,则执行body,否则执行sleep(settimeout?)-这显然是一个非常糟糕的启发,没有人会实现,因为它不是线程安全的,但这是如何处理竞争条件的一般概念)


我相信至少有一个在web上创建互斥的例子,但我没有详细研究过——它有一些批评者,但我不知道用javascript实现“线程安全”的另一种方法。我从来都不需要实现js“线程安全”,但如果我必须在javascript中处理竞争条件,我就开始考虑实现js“线程安全”

不能简单地用javascript实现互斥,因为实际上没有内置的睡眠功能可用

见:

此外,无法确保互斥体中的布尔标志不会与另一个线程同时被访问,因此布尔本身需要一个互斥体。。。等等等等。您需要java中的Synchronized关键字这样的东西才能在javascript中使用,而这根本不存在。我曾经有过担心线程安全的情况,但是当我使用代码时,如果发生了错误但还没有发生错误,我会使用一个替代方案


因此,我的建议是,如果您遇到错误,可能不是因为竞争条件。

不确定这是否有帮助,但看起来您正在尝试创建托管连接池。几年前我做了一个,在这里仍然很好:

池确保按照您提供的顺序发出请求(当然,它们可能会根据性能以任何顺序返回),使用您定义的尽可能多的同时请求(受系统限制)。您可以为不同的目的实例化多个池


如果没有其他东西,这可能会给你一些想法。

你能给我一个链接,我可以在那里找到资料来查看它吗?链接在答案中-你有问题吗?这里没有标记:下载链接在页面的第一部分。您好,是的,我有一个问题。每次单击链接,我都会看到一个蓝色框,标题为“处理请求时出错”,元素DP在class[Ljava.lang.String]类型的Java对象中未定义;在我这边引用了asSorry-dumb bug(我刚刚将我的站点移动到新服务器/ColdFusion版本,但未能为新用户更改指针)。它现在应该可以工作了。上面的链接应该可以到达文档,但是代码的链接是:很抱歉再次遇到挫折,但是谢谢你帮我指出我的愚蠢!