JavaScript中不干扰UI交互的后台任务

JavaScript中不干扰UI交互的后台任务,javascript,javascript-events,background,web-worker,Javascript,Javascript Events,Background,Web Worker,我正在开发一个用JavaScript实现的移动应用程序,它需要做很多后台工作——主要是从服务器(通过JSONP)获取数据,然后使用本地存储将数据写入数据库。在前台,用户可以在本地存储的数据上导航,因此需要一个反应平稳的应用程序 这种交互(通过JSONP从服务器获取数据,并在对其进行一些小的操作后,将其存储在本地数据库中)是异步完成的,但由于JSONP和数据库交互需要进行DOM操作,因此我无法与WebWorkers进行此项工作。因此,我遇到了用大量“后台处理请求”阻塞JavaScript事件队列的

我正在开发一个用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中都不可用。