代码之家  ›  专栏  ›  技术社区  ›  aepheus

javascript异步编程(非AJAX)

  •  8
  • aepheus  · 技术社区  · 15 年前

    是否有可能在javascript中异步执行操作(除了AJAX之外)?例如,同时迭代多个数组。怎么做到的?举个简单的例子就好了。搜索这个很难,因为所有的ajax污染,这不是我要找的。

    提前谢谢。

    6 回复  |  直到 15 年前
        1
  •  9
  •   Teja Kantamneni    15 年前
        2
  •  6
  •   Grumdrig    15 年前

    你可以用 setTimeout .

    setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
    setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
    

    我不确定它的并发性如何,但它是一个异步编程模型。

        3
  •  4
  •   MooGoo    15 年前

    正如Grumdrig所说,您可以编写如下代码:

    setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
    setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
    

    • 后面有代码吗 setTimeout 调用将立即运行,包括返回调用函数。
    • 如果队列中有其他计时器处于或超过其延迟时间或间隔时间,则将一次执行一个计时器。
    • 当任何一个计时器正在运行时,另一个计时器可能会达到其间隔/延迟时间,但直到最后一个计时器完成后才会运行。
    • 一些浏览器优先处理用户交互触发的事件,例如 onclick onmousemove ,在这种情况下,附加到这些事件的函数将以牺牲计时器精度为代价执行。
    • 这将一直持续到出现一个打开(以前没有调用计时器或事件处理程序请求执行)。只有这样,示例代码中的函数才会运行。一次一个,第一个很可能,但不一定先执行。另外,我还大胆猜测,有些浏览器可能会设置一个最小延迟时间,这会使任何设置为0毫秒延迟的计时器运行得比预期的还要晚。

    显然,这样运行代码没有性能优势。在任何情况下,这都会使事情需要更长的时间才能完成。但是,如果单个任务占用的时间太长而导致浏览器冻结(并且可能会触发“脚本占用的时间太长”浏览器警告),则将其分解为更小、执行速度更快的部分会很有帮助,这些部分会在一段延迟时间后依次运行,从而给浏览器一些喘息的时间。

    已经提到了webworkers,如果您不关心IE兼容性,那么您可以使用它们来实现真正的并发性。但是,出于安全原因,对其使用有一些严格的限制。例如,它们不能以任何方式与DOM交互,这意味着对页面的任何更改仍然必须同步进行。此外,传入和传出worker的所有数据都在传输过程中序列化,这意味着不能使用真正的Javascript对象。也就是说,对于密集的数据处理,Web工作者可能是比将一个函数分解为多个计时器延迟的任务更好的解决方案。

        4
  •  2
  •   Jaanus    15 年前

    这一领域的一个新发展是 HTML5 Web Workers.

        5
  •  1
  •   Kathy Van Stone    15 年前

    web workers 正如其他人所指出的那样。旧的方法通常是使用AJAX并在服务器上完成工作(无论是使用webworkers还是AJAX,都必须序列化数组并反序列化结果)

        6
  •  1
  •   tomg    14 年前

    我不得不同意穆古的观点,我也想知道你为什么要一次穿过这么大的阵列。

    StratifiedJS ,它允许您同时执行多个任务,只要它们是异步的。而且,webworkers是一个笨拙的“解决方案”,只会使事情变得更复杂,而且,它们在IE中不起作用。

    在分层DJ中,你可以直接写。

    waitfor {
       // do something long lasting here...
    }
    and {
      // do something else at the same time...
    }
    // and when you get here, both are done