我有以下问题:
假设我有一个函数处理数组,根据接收的参数对它做一些事情。如下所示:
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秒,一切正常。如果不是,我在删除时会收到错误,因为元素不存在。这表明第二次调用是在第一次完成之前进行的。
答案 0 :(得分:2)
JS不会并行调用函数。您的processArr
函数按顺序执行。
这显然假设您不是简单地开始,例如函数中的AJAX请求 - 如果你执行下一个函数,显然不会等待请求完成(直到它同步)。
答案 1 :(得分:0)
发现问题。我正在使用的库(raphaeljs)进行了异步调用。 Srry因失去时间:)。