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.
javascript
design-patterns
ajax
Ominus
fonte
fonte
Respostas:
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.
fonte
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
fonte
Promise.then()
para executar retornos de chamada assíncronos na ordem correta.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.
fonte