JavaScript - как обрабатывать функции, чтобы не все сразу
У меня есть следующая проблема:
Допустим, у меня есть функция, которая обрабатывает массив, чтобы что-то с ним делать в зависимости от полученных параметров. Так что-то вроде:
var arr = [];
function processArr(p1, p2, ....){};
p1, p2 и т. д. получены с сервера, поэтому мы получаем:
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...)
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...)
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...)
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...)
processArr(<?php echo $p1; ?>, <?php echo $p2; ?>, ...)
Это на самом деле PHP для, но на самом деле не имеет значения.
Проблема: js обрабатывает вызовы одновременно (не точно одновременно, но достаточно близко), а не один за другим. Так что, если при первом вызове я добавляю элемент в массив (затем некоторую другую обработку), а при втором вызове я пытаюсь удалить элемент, при удалении элемент не существует, потому что он еще не был добавлен.
Как мне сделать второй звонок, чтобы дождаться первого, чтобы закончить?
Добавлена функция:
function processSaved(act, params)
{
if (act == 1)
{
var newUser = params;
if (user.id == newUser.id)
user = clone(newUser);
activeElementIndex = i;
// Go to the next level from the active element level
var newLevel = newUser.level;
// Set current level
currentLevel = Math.max(currentLevel, newLevel);
// Create new object and push it to elements array
var obj = newUser;
elements.push(obj);
activeElementIndex = newUser.parent;
// Add element to order list
if (orderElements.length + 1 > newLevel)
{
var added = 0;
for (var i = 0; i < orderElements[newLevel - 1].el.length; i++)
{
if (elements[activeElementIndex].column < elements[elements[orderElements[newLevel - 1].el[i]].parent].column)
{
orderElements[newLevel - 1].el.splice(i, 0, elements.length - 1);
added = 1;
break;
}
}
if (added == 0)
orderElements[newLevel - 1].el.push(elements.length - 1);
}
else
{
var tmp = new Array();
tmp.push(elements.length - 1);
var obj = {"el": tmp};
orderElements[newLevel - 1] = obj;
}
flagCreate = 1;
actions.push(newUser);
// Call the rearange function
rearangeElementsWithoutRedraw();
}
else if (act == 0)
{
activeElementIndex = params.index;
deleteNode();
}
return true;
}
Первый вызов выполняется с act = 1. Второй вызов выполняется с act = 0. Если я добавляю тайм-аут ко второму вызову, скажем, 0,5 секунды, все работает нормально. Если нет, я получаю ошибку при удалении, потому что элемент не существует. Это говорит о том, что второй вызов сделан до того, как первый закончен.
2 ответа
JS не вызывает функции параллельно. Ваш processArr
Функции выполняются последовательно.
Очевидно, это предполагает, что вы не просто запускаете, например, AJAX-запрос в функции - если вы сделаете это, следующая функция, очевидно, не будет ждать завершения запроса (пока он не будет синхронным).
Нашел проблему. Произошел асинхронный вызов из библиотеки, которую я использовал (Raphaeljs). Извините за потерю времени:).