Existe uma maneira de abortar uma renderização assíncrona slickgrid?
-
26-09-2019 - |
Pergunta
Eu tenho uma página de pesquisa cujos resultados são renderizados em um slickgrid. É uma pesquisa de Ajax que executa onkeyup
, por isso é possível que uma pesquisa seja realizada, a instância slick.Grid render
para ser chamado e ter outro resultado voltar antes do primeiro assíncrono render
completa. Eu gostaria de cancelar o inicial render
Assim que o segundo pedido de Ajax voltar para que não haja dois render
Chamadas ocorrendo ao mesmo tempo.
Editar com exemplo:
Aqui está o que estou fazendo, com alert
está no lugar para rastrear a ordem de execução.
function setupGrid() {
slickDataView = new Slick.Data.DataView();
slickGrid = new Slick.Grid(slickGridDiv, slickDataView.rows, slickGridColumns, slickGridOptions);
slickDataView.onRowsChanged.subscribe(function(rows) {
slickGrid.removeRows(rows);
slickGrid.updateRowCount();
slickGrid.render();
});
slickDataView.onRowCountChanged.subscribe(function(args) {
slickGrid.updateRowCount();
slickGrid.render();
});
}
function performSearch() {
jQuery.get('searchPage.php', {MODEL_ID: userInputField.val()},
function(results) {
slickDataView.beginUpdate();
alert(1);
slickDataView.setItems(results);
alert(2);
slickDataView.endUpdate();
}
);
}
setupGrid();
userInputField.keyup(function() { performSearch(); });
Eu recebo os seguintes alertas nesta sequência quando digito dois números no userInputField
Campo de texto em rápida sucessão:
1
1
2
Solução
Deve haver algo mais acontecendo na sua página. O exemplo que você listou é impossível - a execução do JavaScript nunca é interrompida por um evento sendo demitido. O evento é apenas na fila e apanhado pelo loop do evento após a execução do código atual. O que você veria no seu exemplo é 1212.
Você deseja acelerar as chamadas do Ajax e também cancelar os retornos de chamada das chamadas anteriores, pois suas respostas do Ajax podem voltar fora do pedido e os resultados de pesquisa mais antigos podem substituir os mais novos.