Est-il possible d'interrompre un asynchrone SlickGrid rendu?
-
26-09-2019 - |
Question
J'ai une page de recherche dont les résultats sont rendus dans un SlickGrid. Il est une recherche ajax qui exécute onkeyup
, il est donc possible pour une recherche à effectuer, le render
de l'instance Slick.Grid à appeler, et un autre résultat revenir avant la première render
asynchrone se termine. Je voudrais annuler la render
initiale dès que la deuxième demande de paiement ajax revient donc qu'il n'y a pas deux appels render
qui se déroulent en même temps.
Modifier l'exemple :
Voici ce que je fais, avec alert
s en place pour suivre l'ordre d'exécution.
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(); });
Je reçois les alertes suivantes dans cette séquence quand je tape deux chiffres dans le champ de texte userInputField
en succession rapide:
1
1
2
La solution
Il doit y avoir autre chose se passe sur votre page. L'exemple que vous avez énumérés est impossible - l'exécution de JavaScript est jamais interrompue par un événement se faire congédier. L'événement vient se mis en attente et repris par la boucle d'événements après le code actuel est fait exécuter. Ce que vous verrez dans votre exemple, est 1212.
Vous voulez les appels AJAX accélérateur et aussi d'annuler les callbacks des appels précédents car vos réponses AJAX peuvent revenir sur l'ordre et les résultats de recherche plus peuvent remplacer les plus récentes.