我听说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函数中进行并行执行,也可以用它来加速我的函数执行。
答案 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中操作主脚本的全局对象,也不能返回复杂的对象。