在javascript中并行执行函数

时间:2014-05-29 17:26:41

标签: javascript jquery parallel-processing

我听说javascript是单线程的我是对的吗? 那么如何并行(同步)实现函数(多个)的执行。

我有如下所示的脚本,我想告诉你每个xml文件大小为4.6MB。

myfunction('sample1.xml');
myfunction('sample2.xml');
myfunction('sample3.xml');
    .
    .
myfunction('sample15.xml');

function myfunction(name) {

    $.ajax({
        type: "GET",
        url: name,
        dataType: "xml",
        success: parseXml
    });

    function parseXml(xml) {

        //searching the xml file 


    }

}

我的目标是加快搜索xml文件的过程,因为我认为并行执行是好的。 那么可以在javascript函数中进行并行执行,也可以用它来加速我的函数执行。

1 个答案:

答案 0 :(得分:3)

您可以根据需要触发尽可能多的ajax请求,它们将并行触发,因为默认情况下它们是异步的。问题是,只要ajax请求准备就绪,您的浏览器就会执行parseXML,所以无论如何您可能会冻结浏览器。

您可以使用Mark Gabriel的回复推迟执行parseXML

setTimeout(function(){ parseXML(xml) }, 0)

这会阻止浏览器冻结,但最终会顺序执行parseXML。

根据您在parseXML中尝试做什么,最好使用Webworkers在并行浏览器进程中执行XML解析。这样,您将打开后台进程以执行特定任务。您创建工作者并将文件名作为消息发送,然后等待工作者返回您对parseXML的期望

var worker = new Worker('/js/parseXML.js');
worker.addEventListener('message', function (e) {
        console.log('Webworker answer is',e);
    }, false);

worker.postMessage('sample1.xml'); // Send data to our worker.

parseXML.js的内容将是

importScripts("/js/jquery.js");

self.addEventListener('message', function (e) {
    console.log('Webworker received', e.data);
    $.ajax({
        type: "GET",
        url: e.data,
        dataType: "xml",
        success: parseXml
    });

    function parseXml(xml) {
        //searching the xml file 
        self.postMessage(parsedXML);
    };
}, false);

请记住,如果您计划将字符串,数组或散列作为parseXML的返回值,则此逻辑才有意义。您不能在webworker中操作主脚本的全局对象,也不能返回复杂的对象。