JavaScript中不干扰UI交互的后台任务
我正在开发一个用JavaScript实现的移动应用程序,它需要做很多后台工作——主要是从服务器(通过JSONP)获取数据,然后使用本地存储将数据写入数据库。在前台,用户可以在本地存储的数据上导航,因此需要一个反应平稳的应用程序 这种交互(通过JSONP从服务器获取数据,并在对其进行一些小的操作后,将其存储在本地数据库中)是异步完成的,但由于JSONP和数据库交互需要进行DOM操作,因此我无法与WebWorkers进行此项工作。因此,我遇到了用大量“后台处理请求”阻塞JavaScript事件队列的问题,应用程序的反应非常缓慢(甚至完全锁定) 以下是我处理背景资料的一个小技巧:JavaScript中不干扰UI交互的后台任务,javascript,javascript-events,background,web-worker,Javascript,Javascript Events,Background,Web Worker,我正在开发一个用JavaScript实现的移动应用程序,它需要做很多后台工作——主要是从服务器(通过JSONP)获取数据,然后使用本地存储将数据写入数据库。在前台,用户可以在本地存储的数据上导航,因此需要一个反应平稳的应用程序 这种交互(通过JSONP从服务器获取数据,并在对其进行一些小的操作后,将其存储在本地数据库中)是异步完成的,但由于JSONP和数据库交互需要进行DOM操作,因此我无法与WebWorkers进行此项工作。因此,我遇到了用大量“后台处理请求”阻塞JavaScript事件队列的
var pendingTasksOnNewObjects = new Object();
//add callbacks to queue
function addTaskToQueue(id, callback) {
if (!pendingTasksOnNewObjects[id]) {
pendingTasksOnNewObjects[id] = new Array();
}
pendingTasksOnNewObjects[id].push(callback);
}
// example for this pending tasks:
var myExampleTask = function () {
this.run = function(jsonObject) {
// do intersting stuff here as early as a specific new object arrives
// i.e. update some elements in the DOM to respect the newly arrived object
};
};
addTaskToQueue("id12345", myExampleTask);
// method to fetch documents from the server via JSONP
function getDocuments(idsAsCommaSeparatedString) {
var elem;
elem = document.createElement("script");
elem.setAttribute("type", "text/javascript");
elem.setAttribute("src", "http://serverurl/servlet/myServlet/documents/"+idsAsCommaSeparatedString);
document.head.appendChild(elem);
}
// "callback" method that is used in the JSONP result to process the data
function locallyStoreDocuments(jsonArray) {
var i;
for (i=0; i<jsonArray.length; i++) {
var obj = jsonArray[i];
storeObjectInDatabase(obj);
runTasks(obj.docID, obj);
}
return true;
}
// process tasks when new object arrives
function runTasks(id, jsonObject) {
if(pendingTasksOnNewObjects[id]) {
while(pendingTasksOnNewObjects[id][0]) {
pendingTasksOnNewObjects[id][0].run(jsonObject);
pendingTasksOnNewObjects[id].shift();
}
}
return true;
}
var pendingTasksOnNewObjects=新对象();
//将回调添加到队列
函数addTaskToQueue(id,回调){
如果(!PendingTaskSonnerObjects[id]){
PendingTaskSonnerObjects[id]=新数组();
}
PendingTaskSonnerObjects[id]。推送(回调);
}
//此挂起任务的示例:
var myExampleTask=函数(){
this.run=函数(jsonObject){
//当一个特定的新对象到达时,在这里做一些有趣的事情
//也就是说,更新DOM中的一些元素以尊重新到达的对象
};
};
addTaskToQueue(“id12345”,myExampleTask);
//方法通过JSONP从服务器获取文档
函数getDocuments(idsAsCommaSeparatedString){
var-elem;
elem=document.createElement(“脚本”);
元素setAttribute(“类型”、“文本/javascript”);
元素setAttribute(“src”http://serverurl/servlet/myServlet/documents/“+idsAsCommaSeparatedString);
文件.标题.附件(elem);
}
//JSONP结果中用于处理数据的“回调”方法
函数locallyStoreDocuments(jsonArray){
var i;
对于(i=0;iWeb Workers,似乎在iOS 5中可用,感谢您的回答!但正如我前面所述,Web Workers不适用,因为我必须执行DOM操作才能请求JSONP数据和本地存储来处理结果。这两种功能在Web Workers中都不可用。