如果你不想使用jQuery,那么你可以使用Web Worker与同步请求相结合。Web Worker在除了Internet Explorer 10之前的所有主要浏览器中都得到支持。
基本上,如果你不完全确定Web Worker是什么,可以将其视为浏览器在不影响主线程的情况下执行专业JavaScript的一种方式(注意:在单核CPU上,两个线程将交替运行。幸运的是,现在大多数计算机都配备有双核CPU)。通常,Web Worker用于复杂的计算或某些强烈的处理任务。只需记住,Web Worker中的任何代码都不能引用DOM,也不能引用未传递给它的任何全局数据结构。实际上,Web Worker独立于主线程运行。工人执行的任何代码都应该与您的JavaScript代码库分开,放在自己的JS文件中。此外,如果Web Worker需要特定的数据才能正常工作,则需要在启动它们时将该数据传递给它们。
另外一个值得注意的重要事项是,您需要使用任何JS库来加载文件,这些库都需要直接复制到工作线程将执行的JavaScript文件中。这意味着这些库应该首先被缩小(如果它们还没有被缩小),然后复制并粘贴到文件顶部。
无论如何,我决定编写一个基本模板来向您展示如何处理此问题。请查看下面的内容。随时提出问题/批评/等等。
在您希望保持在主线程上执行的JS文件中,您需要像下面的代码一样调用工作线程。
function startWorker(dataObj)
{
var message = {},
worker;
try
{
worker = new Worker('workers/getFileData.js');
}
catch(error)
{
}
message.data = dataObj;
message = JSON.stringify(message);
worker.onMessage = function(e)
{
display(JSON.parse(e.data));
}
worker.postMessage(message);
}
然后,在一个专门为工作人员准备的文件中(如上面的代码所示,我将我的文件命名为
getFileData.js
),编写以下内容...
function fetchFiles(source)
{
}
function loadFile(file)
{
}
onmessage = function(e)
{
var response = [],
data = JSON.parse(e.data),
file_list = fetchFiles(data.source),
file, fileData;
if (!file_list)
{
response.push('failed to fetch list');
}
else
{
for (file in file_list)
{
fileData = loadFile(file);
if (!fileData)
{
response.push('failed to load: ' + file);
}
else
{
response.push(fileData);
}
}
}
response = JSON.stringify(response);
postMessage(response);
close();
}
PS: 另外,我找到了另一个帖子,可以更好地帮助您理解在与 Web Workers 结合使用同步请求的优缺点。
Stack Overflow - Web Workers and Synchronous Requests