我的问题是以下内容。我写了一个ajaxengine类,该类在构造函数中创建一个新的xmlhttprequest对象。该类包含一种称为响应的方法,当XMLHTTPRequest对象的“ ReadyStateChange”已更改时,该方法称为该方法。因此,现在我创建了ajaxengine => 4 xmlhttprequest对象的4个实例。

现在,我有另一个类datarequester,它具有一个阵列 - attribute datareq,该datareq具有Ajaxengine的实例。整个程序中只有一个datareqeuster的实例! Datarequester具有称为CallEnfined的功能。该函数是由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 --;
}
有帮助吗?

解决方案

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

DP_REQUESTPOOL库

池确保使用您提供的订单按订单提出请求(尽管当然可以根据绩效返回任何顺序)使用与您定义的尽可能多的同时请求(受系统限制)。您可以为不同的目的实例化多个池。

如果没有别的,这可能会给您一些想法。

其他提示

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

您的DatareQeuster / singleton /可以具有变量“测试”数组,因此代替在多个实例上共享单个变量,而是创建多个数据实例。因此,为了计算结果,您需要总和“测试”数组。

您需要实现临时的静音(想法是,启发式将检查一个布尔并将其设置为true,如果它是错误的,否则请睡觉(SettimeTimeout?) - 这显然是一个非常糟糕的启发式方法,没有人会实施由于它不是安全的,但这就是您如何应对比赛条件的一般概念)。

我相信至少有一个在网络上创建静音的示例,但我没有详细介绍一下 - 它有一些批评者,但我没有意识到在JavaScript中实现“线程安全”的另一种方法。我从来没有需要实现JS“线程安全”,但是我开始寻找是否必须在JavaScript中处理比赛条件。

您不能仅仅因为实际上没有内置的睡眠功能而在JavaScript中进行静音。

看: 是否有等效的JavaScript或jQuery睡眠功能?

另外,没有办法确保您的静音中的布尔旗与另一个线程同时访问,然后布尔值本身需要mutex ...等等,依此类推。您可能需要Java中的Java中的同步关键字之类的东西,在JavaScript中可用,这根本不存在。我遇到过我担心线程安全性的情况,但是如果发生错误但尚未发生的情况,则随着代码带有替代计划的情况。

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

您如何看待以下文章?我刚刚在Google中找到了

http://www.developer.com/lang/jscript/article.php/3592016

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top