用jquery进行异步调用

时间:2011-01-28 17:35:49

标签: javascript jquery

我有一个名为checkStatus(x)的函数,其中x是Id。如何异步调用此函数n次?没有依赖于另一个完成而另一个开始?

我正在使用jquery

修改

我不确定我是否使用了正确的术语,但这就是我想要的。我有一个ID列表,我通过列表迭代,我想为每个ID执行此函数。

但我不想等待一个id芬兰语,然后在另一个id上执行此函数。是否可以同时执行此功能?

2 个答案:

答案 0 :(得分:6)

Javascript引擎是单线程的,这意味着一次只执行一段代码。异步功能(AJAX,timeouts / intervals)导致不同的代码块按顺序运行,而不是并行运行(即在Javascript中永远不会使用多个处理器内核)。

生成异步(非阻塞)代码的最简单方法是使用setTimeoutI strongly discourage using setInterval),正如其他人所建议的那样,但这样做没有性能优势。通过允许浏览器的其他任务(例如页面重新绘制和用户输入)运行,这可以简单地确保浏览器在慢速JS计算期间不会“挂起”。它实际上不会提高这些计算的速度(事实上,由于超时的额外开销很小,它会稍微减慢它们。)

可以使用web workers在Javascript中创建单独的线程,但它们的功能有限(例如,它们无法更改DOM)和they are not yet supported by IE

使用“递归”setTimeout调用的长时间非阻塞任务示例:

function getStarted(elements) {
    // this function must be inside the outer function
    // so that `i` (below) can be accessed via a closure
    function processElement() {
        // do work on elements[i] here
        // or pass it to another function

        // this continues only if we haven't hit the end of the array,
        // like the second and third clauses of a `for` loop
        if (++i < elements.length) {
            setTimeout(processElement, 0);
        }
    }

    // don't bother with empty arrays
    if (elements.length) {
        // the same `i` is used each time processElement runs
        // and acts just like a `for` loop index
        var i = 0;

        // optional: make a copy of the array so that it
        // doesn't get modified while we're working
        elements = elements.slice();

        // even a zero-millisecond "delay" gives the browser the
        // opportunity to run other code
        setTimeout(processElement, 0);
    }
}

答案 1 :(得分:2)

使用setTimeoutsetInterval功能。

setTimeout(function(){checkStatus(x);}, 100);
setTimeout(function(){checkStatus(x);}, 200);
setTimeout(function(){checkStatus(x);}, 300);