Есть ли способ прервать асинхронный асинхронный?
-
26-09-2019 - |
Вопрос
У меня есть поисковая страница, результаты которых отображаются в SlickGrid. Это поиск Ajax, который выполняет onkeyup
, так что это возможно для выполнения поиска, экземпляр Slick.Grid's render
быть вызванным, и у другого результата вернутся до первого асинхронного render
завершает. Я хотел бы отменить начальный render
Как только вторая ajax запрос возвращается, чтобы не два render
звонки, происходящие одновременно.
Редактировать с примером:
Вот что я делаю, с alert
s на месте для отслеживания заказа исполнения.
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(); });
В этой последовательности я получаю следующие оповещения, когда я вводит два номера в userInputField
Текстовое поле в быстрой последовательности:
1
1
2
Решение
На вашей странице должно быть что-то еще. Приведенный вами пример невозможен - выполнение JavaScript никогда не прерывается событием. Событие только что входит в очередь и подхвачена циклом события после выполнения текущего кода. То, что вы увидите в своем примере, это 1212.
Вы захотите включить вызовы AJAX, а также отменить обратные вызовы из предыдущих вызовов, так как ответы AJAX могут вернуться из строя, а более старые результаты поиска могут переопределить новые.