Condições de corrida do Ajax

8

Existe uma maneira padrão ou padrão de lidar com as condições de corrida do Ajax? Veja o exemplo a seguir. Você tem duas mesas. Clicar em uma linha na tabela 1 remove os dados do banco de dados e atualiza a tabela 2 (que agora mostraria todas as linhas da tabela 1 menos a linha clicada).

Se alguém onde clicar em um monte de linhas em rápida sucessão, você pode obter um cenário em que a tabela 2 não é atualizada para todos os cliques, devido a problemas de tempo / atraso.

Qual seria uma boa maneira de abordar isso? Eu estava pensando em usar uma fila possível, mas isso acaba com o propósito de fazê-lo de forma assíncrona. No entanto, eu ainda teria o benefício da interface do usuário não bloqueada.

Ominus
fonte
AJAX e bancos de dados? Como os dois se reúnem nisso?
Oded
sim, eu era meio vago. É um aplicativo da web com dados sendo enviados / recuperados via ajax, mais especificamente jQuery.get / post.
ominus

Respostas:

8

Apenas um pensamento, talvez você possa criar uma lista para seus métodos de retorno de chamada do Ajax. Você agruparia seu retorno de chamada Ajax real em um método que adiciona esse retorno a um slot em uma lista.

Essa lista aguarda retornos de chamada em uma ordem específica e é executada apenas se o elemento superior (o retorno de chamada que você deseja chamar primeiro) for preenchido.

Greg
fonte
1
Aninhar programaticamente os retornos de chamada é uma solução sólida.
21412 Sam
7

Esta não é uma condição de corrida.

Uma condição de corrida ocorreria quando o comportamento entre dois threads assíncronos se tornasse indefinido. Você pode resolver esse problema aninhando o retorno de chamada da primeira chamada

Sam
fonte
6
Nem todas as chamadas AJAX serão concluídas na mesma velocidade devido a possíveis problemas de rede. Vemos isso ainda em desenvolvimento em nossa rede local, onde uma chamada AJAX posterior será concluída antes de uma anterior e a interface do usuário acaba errada. Aninhar / enfileirar retornos de chamada resolverá isso, mas essa é uma condição de corrida.
Izkata
1
@ Izkata Isso está incorreto, o Javascript não tem condições de corrida porque é executado em um único encadeamento. A situação que você está descrevendo é semelhante à execução de duas funções ao mesmo tempo, uma para abrir um arquivo e outra para ler o conteúdo do arquivo aberto. A função de abertura de arquivo deve ser executada antes da função de leitura, mas a execução de ambas ao mesmo tempo significa que às vezes a segunda função é executada primeiro. Esta não é uma condição de corrida, está falhando em encomendar as coisas corretamente. A resposta correta para Javascript em 2017 é usar Promise.then()para executar retornos de chamada assíncronos na ordem correta.
Daniel T.
1
@ Izkata Não é uma condição de corrida, é uma questão de pedidos. A solicitação em si é tratada nativamente pelo navegador, mas o retorno de chamada é executado no encadeamento JS. As condições de corrida são causadas quando dois threads em execução compartilham o mesmo recurso e leem / gravam no recurso ao mesmo tempo, levando a uma saída não determinística. Se você tiver duas solicitações AJAX simultâneas, a saída é determinística; é o resultado do retorno de chamada A ou do retorno de chamada B. O que você não sabe é a ordem em que os retornos de chamada serão chamados. Isso não é diferente de fornecer dois botões para o usuário e
Daniel T.
1
sem saber em qual botão o usuário clicará primeiro. O resultado será o retorno de chamada do botão A ou o retorno de chamada do botão B, mas nunca uma saída imprevisível e não determinística. Se você precisar controlar a ordem em que os retornos de chamada são invocados, precisará usar promessas. Mas o tempo imprevisível da chamada de retorno de chamada não é a mesma coisa que as condições de corrida.
17267 Daniel T.
1
@Izkata Um 'resultado inesperado' em uma condição de corrida significa que uma função não é determinística, algo que não acontece no JS devido exatamente ao que você disse: "quando qualquer comportamento simultâneo pode causar um resultado inesperado". A palavra-chave aqui é simultânea; As solicitações AJAX são simultâneas, os retornos de chamada não. Portanto, o resultado das funções de retorno de chamada em JS sempre são determinísticas, porque são executadas seqüencialmente, nunca simultaneamente. Esta publicação é uma boa leitura: blog.raananweber.com/2015/06/17/…
Daniel T.
6

De um modo geral, os retornos de chamada são uma ferramenta universal para lidar com tarefas assíncronas e, na verdade, retornos de chamada é o mecanismo para lidar com solicitações AJAX em JavaScript. No contexto do retorno de chamada, você pode até ter referência à linha que é clicada (se fechada no fechamento). Você pode encontrar os seguintes artigos úteis: jQuery adiado e Usando adiados no jQuery

Outra coisa que você deve ter em mente, se o usuário tiver permissão para clicar em vários botões, é que várias solicitações serão iniciadas. No entanto, navegadores diferentes podem lidar com um número diferente de solicitações AJAX simultaneamente: concurrent-ajax-xmlhttprequest-orders . Para superar isso, você deve implementar alguma fila de solicitações básicas.

rusev
fonte
+1 por ser o único a falar sobre coisas adiadas.
Florian Margaine 14/05