我听说 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 函数中并行执行,或者它们是否可以加快我的函数执行速度。
最佳答案
您可以根据需要触发任意数量的 ajax 请求,它们将并行触发,因为它们默认是异步的。问题是只要 ajax 请求准备就绪,您的浏览器就会执行 parseXML,因此您可能无论如何都会卡住浏览器。
您可以根据 Mark Gabriel 的响应推迟 parseXML 的执行
setTimeout(function(){ parseXML(xml) }, 0)
这将防止浏览器卡住,但最终会按顺序执行 parseXML。
根据您在 parseXML 中究竟想做什么,最好使用网络 worker 在并行浏览器进程中执行 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 中对主脚本的全局对象进行操作,也不能返回复杂对象。
关于javascript - javascript中函数的并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939290/