javascript - 如何按顺序处理函数而不是同时处理所有函数

标签 javascript function simultaneous-calls

我有以下问题:

假设我有一个处理数组的函数,根据接收到的参数对其进行处理。所以类似:

 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 秒),则一切正常。如果不是,我在删除时会收到错误,因为元素不存在。这表明第二次调用是在第一次调用完成之前进行的。

最佳答案

JS 不会并行调用函数。您的 processArr 函数会按顺序执行。

这显然假设您不只是简单地开始,例如函数中的 AJAX 请求 - 如果您执行下一个函数,显然不会等待请求完成(直到它同步)。

关于javascript - 如何按顺序处理函数而不是同时处理所有函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598745/

相关文章:

c - 我正在使用以下 C 代码

java - 从 DatePicker 更新 TextView

javascript - JQuery - 连续多次调用一个函数时,为什么只有最后一次调用的回调正确执行?

php - file_exists 和使用特定名称 (php) 保存文件之间会发生什么?

javascript - Ember 应用程序性能

javascript - 在客户端缓存大量的 json 结果

javascript - 在 ASP 中格式化 float

c++ - 为什么我不能在 C++ 中将函数作为参数跨类传递?

java - 同时运行 2 个线程

javascript - 如何在 D3.js 中指定多种事件类型