Execute Background Task In Javascript

后端 未结 9 1625
迷失自我
迷失自我 2020-11-28 22:39

I have a cpu intensive task that I need to run on the client. Ideally, I\'d like to be able to invoke the function and trigger progress events using jquery so I can update

9条回答
  •  半阙折子戏
    2020-11-28 23:16

    Basically, what you want to do is to divide the operation into pieces. So say you have 10 000 items you want to process, store them in a list and then process a small number of them with a small delay between each call. Here's a simple structure you could use:

    function performTask(items, numToProcess, processItem) {
        var pos = 0;
        // This is run once for every numToProcess items.
        function iteration() {
            // Calculate last position.
            var j = Math.min(pos + numToProcess, items.length);
            // Start at current position and loop to last position.
            for (var i = pos; i < j; i++) {
                processItem(items, i);
            }
            // Increment current position.
            pos += numToProcess;
            // Only continue if there are more items to process.
            if (pos < items.length)
                setTimeout(iteration, 10); // Wait 10 ms to let the UI update.
        }
        iteration();
    }
    
    performTask(
        // A set of items.
        ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o'],
        // Process two items every iteration.
        2,
        // Function that will do stuff to the items. Called once for every item. Gets
        // the array with items and the index of the current item (to prevent copying
        // values around which is unnecessary.)
        function (items, index) {
            // Do stuff with items[index]
            // This could also be inline in iteration for better performance.
        });
    

    Also note that Google Gears has support to do work on a separate thread. Firefox 3.5 also introduced its own workers that do the same thing (although they follow the W3 standard, while Google Gears uses its own methods.)

提交回复
热议问题