Pergunta

Meu problema é o seguinte. Eu escrevi um Ajaxengine de classe, que cria no construtor um novo objeto XmlHttPrequest. A classe contém um método chamado ResponseanAlyser, que é chamado quando o "ONREADESTATECHANGE" do objeto xmlHttPrequest mudou. Então agora eu criei, digamos 4 instâncias de AjaxEngine => 4 XmlHttPrequest Objects.

Agora eu tenho outro DataeQuester de classe, que possui um Dataareq de matriz, que mantém as instâncias do AjaxEngine. Existe apenas uma instância do DataareQeuster em todo o programa! Dataarequester tem uma função chamada call whenfinished. A função é chamada, pela função, responsável por AjaxEngine e diminui uma variável da instância do Dataarequester.

Mas acho que lá acontecem condições de corrida. Como eu poderia precedi -los em 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 --;
}
Foi útil?

Solução

Não tenho certeza se isso ajudaria, mas parece que você está tentando criar um pool de conexão gerenciado. Eu fiz um alguns anos atrás que ainda funciona bem aqui:

Biblioteca DP_Requestpool

O pool garante que as solicitações sejam feitas na ordem que você as forneceu (embora, é claro, elas possam ser devolvidas em qualquer ordem com base no desempenho) usando quantas solicitações simultâneas definidas (sujeito a limitações do sistema). Você pode instanciar vários pools para diferentes fins.

Se nada mais, isso pode lhe dar algumas idéias.

Outras dicas

Primeiro de tudo: a maioria dos navegadores orientados para o Ajax suporta a Convenção "apenas 2 solicitações simultâneas para o mesmo domínio". Então, se você começar 4, 2 deles serão pendentes.

Você Dataeqeuster / Singleton / pode ter uma matriz de variável 'teste'; portanto, em vez de compartilhar variável única em várias instâncias, cria várias instâncias de dados. Portanto, para calcular o resultado, você precisará resumir a matriz 'teste'.

Você precisaria implementar um mutex improvisado (a idéia é que uma heurística verifique se há um bool e o definirá como verdadeiro se for falso, então o corpo, caso contrário, durma (setTimeout?) - Isso é obviamente uma heurística muito ruim que ninguém implementaria Como não é seguro, mas esse é o conceito geral de como você lidaria com as condições da corrida).

Acredito que lá pelo menos um exemplo de criação de um mutex na web, mas não olhei em detalhes - ele tem alguns detratores, mas não tenho conhecimento de outra maneira de alcançar 'segurança de threads' em JavaScript. Eu nunca precisei implementar o JS 'segurança de tópicos', mas é isso que começo a procurar se tivesse que lidar com as condições de corrida em JavaScript.

Você não pode fazer um mutex no JavaScript simplesmente porque realmente não há função de sono embutida disponível.

Ver: Existe um JavaScript equivalente ou função de sono jQuery?

Além disso, não há como garantir que a bandeira booleana no seu mutex não esteja sendo acessada ao mesmo tempo que outro thread, o próprio booleano precisa de um mutex ... e assim por diante. Você precisaria de algo como a palavra -chave sincronizada no Java para estar disponível no JavaScript e isso simplesmente não existe. Eu tive situações em que estava preocupado com a segurança do thread, mas quando com o código, com um plano alternativo, ocorreu um erro, mas isso ainda precisa acontecer.

Então, meu conselho é que, se você está recebendo um erro, provavelmente não é por causa de uma condição de corrida.

O que você acha do artigo a seguir? Acabei de encontrar no Google

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top