串口调用JS函数

时间:2014-07-03 05:40:22

标签: javascript jquery arrays post

以下是我要做的事情(实际问题不同,但概述如下):

  1. 我有一个数组[A..Z]。
  2. 对于上面数组中的每个字母,我有另一个数组:

    someArray[alphabet] = [1..100] //another array
    
  3. 对于 someArray [alphabet] 中的每个数字,还有另一个数组:

    anotherArray[number] = [a..z,A..Z,1..1000]
    
  4. 假设对于每个字母,我会在 someArray [alphabet]中获取 someArray [alphabet] 以及每个数字 / strong>,我从服务器上获取 anotherArray [数字] - 这需要时间。

    此外,获取它们的功能如下 - 我进行 jQuery post 调用以从服务器获取数据。我需要按顺序执行它们。

    getAlphabets()
    {
        //I get them here
        //For Each alpha, I call:
        getNumbers(alpha);
    }
    getNumbers(alpha)
    {
        //I get someArray here.
        //For Each element in someArray
        //getAnotherArray(element)
    }
    getAnotherArray(number)
    {
        //I get them here
        //For Each element in anotherArray
        //get all [a..z,A..Z,1..1000]
        //display them
    }
    

    问题是 getNumbers(alpha)的迭代不等待 getAnotherArray(previousIteration)完成。执行(函数调用并行运行(A..Z的同时执行),否则不运行。

    我的步骤:

    1. 我可以按预期检索所有数据,但不能按顺序检索。

    2. 我尝试使用标记 setInterval,clearInterval 来允许/禁止下一次迭代 - 它们无法按预期工作。

    3. 我也尝试使用类似的方法 - getAlphabets()&& getNumbers()& getAnotherArray(),认为这会顺序执行,但我错了。

2 个答案:

答案 0 :(得分:0)

当您具有像ajax调用这样的异步操作时,要按顺序迭代某些数据结构,您必须使用不同的迭代形式。您无法使用常规for循环或while循环。相反,您可以创建一个用于执行迭代的函数。您可以创建一个状态变量来跟踪迭代中的位置。您启动Ajax调用。返回时,处理结果,然后启动下一个ajax调用(随时更新迭代状态)。

以下是一个例子:

假设你有一个任意长度的数组:

var theData = [...];

并且,您希望对该数组中的每个项目进行ajax调用,并将结果收集到另一个数组中。出于特殊原因,您希望强制Ajax调用是顺序的,以便第二次调用仅在第一次调用完成后进行,依此类推。

function processArray(data) {
    var def = $.Deferred();
    var currentItem = 0;
    var results = [];

    function next() {
        if (currentItem < data.length) {
            $.ajax(...).done(function(result) {
                // process the result here
                results.push(result);
                // advance the counter and start the next Ajax call
                ++currentItem;
                next();
            }).fail(function(jqXHR, textStatus, errorThrown) {
                def.reject(jqXHR, textStatus, errorThrown);
            });
        } else {
             def.resolve(results);
        }
    }
    next();
    return def.promise();
}

// call it like this
processArray(theData).done(function(results) {
    // do something with the results array here
});

现在,如果你有三个维度的迭代状态,那么跟踪状态变得有点复杂(你将有三个版本的currentItem来跟踪你在三个维度中的每个维度),但它否则可能是类似的逻辑,当你完成一个维度时,你需要换行到下一行并重新开始。

答案 1 :(得分:-1)

当您使用ajax获取数据时,请求不会以后续方式执行,因为ajax是异步函数。您需要关闭async。所以,它会按照你想要的顺序运行。

async: false

async(默认值:true)
类型:布尔
默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

示例:

jQuery.ajax({
    url: strUrl,
    success: function(html) {
      strReturn = html;
    },
    async:false
  });