Я использую Сортируемое получение для получения элементов из перетаскиваемого списка.Когда это происходит, данные элемента отправляются на сервер с помощью вызова Ajax, и в базе данных создается запись.После этого идентификатор возвращается и добавляется в новый элемент.
У меня также есть функция update для того же сортируемого списка, где при любых изменениях он циклически перебирает список, чтобы получить его.идентификаторы и делает еще один вызов Ajax для обновления значений.
Проблема в том, что процессы смешиваются, и функция обновления захватывает все идентификаторы до загрузки нового элемента, то есть ему не хватает идентификатора нового элемента.
$( ".sort1" ).sortable({
connectWith: ".sortable-sections",
stack: ".sortable-sections ul",
cancel: "input,textarea,button,select,option,[contenteditable],.editorArea,.unsortable",
receive: function(event, ui) {
// lots of things happen
createNewComponentInDB(data);
// leads to the ajax post which if successful $(newItem).attr('id', response);
},
update: function(event, ui) {
// grab list items indexes and ids
// ajax post to update in database
}
Что я могу сделать, чтобы завершить функции в «получении», прежде чем переходить к функциям в «обновлении»?Или есть лучший способ сделать это?
Редактировать:
Пример HTML:
<ul class="space-sections sortable-sections sort1 ui-sortable">
<li class="space-section drag draggable-item ui-sortable-handle" id="5c920e65a7917045fbf62d45" data-component-type="list">
/* ... lots of nested stuff */
</li>
<li class="space-section drag draggable-item ui-sortable-handle" id="5c920e6ca7917045fbf62d46" data-component-type="list">
/* ... lots of nested stuff */
</li>
</ul>
ОБНОВЛЕНИЕ С РЕШЕНИЕМ:
БлагодаряПосле разговора с @ elem4th я смог решить эту проблему, используя «концепцию флага».
Я создал переменную receiveInProgress и установил для нее значение false.
Затем превратил функции внутри «update» в отдельную функцию updateComponentOrderInDB ()
Внутри «update»
if (receiveInProgress == true) {
console.log("Receive in progress! Update will happen on its own.")
} else {
updateComponentOrderInDB();
}
Теперь, в начале 'receive', я установил значение receiveInProgress в true, а в конце вызова Ajax вернул значение false и запустил updateComponentOrderInDB ().Теперь все работает в нужном порядке!