web workers

博客分类: 江河计划

web workers

算法

散列表

class HashTable{
    private items:{} = {};
    private length:number = 0;
    private loseloseHashCode(key:string):number{
        var hash = 0;
        for(var i=0; i<key.length; i++){
            hash += key.charCodeAt(i);
        }
        return hash % 37;
    }
    put(key:string, value:any){
        var pos = this.loseloseHashCode(key);
        this.items[pos] = value;
    }
    remove(key:string){
        var pos = this.loseloseHashCode(key);
        delete this.items[pos];
    }
    get(key:string){
        var pos = this.loseloseHashCode(key);
        return this.items[pos];
    }
}

二叉树

interface Node {
    key: number,
    left: any,
    right: any
}

class Tree {
    private root:any = null;
    private getNode(key:number):Node{
        return {
            key,
            left: null,
            right: null
        }
    }
    private inserNode(oldNode:Node, newNode:Node){
        if(oldNode.key > newNode.key){
            if(oldNode.left === null){
                oldNode.left = newNode;
            }else{
                this.inserNode(oldNode.left, newNode);
            }
        }else{
            if(oldNode.right === null){
                oldNode.right = newNode;
            }else{
                this.inserNode(oldNode.right, newNode);
            }
        }
    }
    public insert(key:number){
        var node = this.getNode(key);
        if(!this.root){
            this.root = node;
        }else{
            this.inserNode(this.root, node);
        }
    }
    public search(key:number, searchNode?:Node){
        var node = searchNode || this.root;
        while(node !== null && node.key !== key){
            if(node.key > key){
                node = node.left;
            }else{
                node = node.right;
            }
        }
        if(node === null){
            return false;
        }
        return node;
    }
    public min(_node?:Node){
        var node = _node || this.root;
        if(this.root === null){
            return false;
        }
        while(node.left !== null){
            node = node.left;
        }
        return node.key;
    }
    public max(_node?:Node){
        var node = _node || this.root;
        if(this.root === null){
            return false;
        }
        while(node.right !== null){
            node = node.right;
        }
        return node.key;
    }
    public remove(key:number, removeNode?:Node){
        var node = removeNode || this.root;
        if(node.key > key){
            node.left = this.remove(key, node.left);
        }else if(node.key < key){
            node.right = this.remove(key, node.right);
        }else{
            if( node.left === null && node.right === null){
                node = null;
            }else if(node.left && node.right === null){
                node = node.left;
            }else if(node.right && node.left === null){
                node = node.right;
            }else{
                var minKey = this.min(node.right);
                node.key = minKey;
                node.right = this.remove(minKey, node.right);
            }
        }
        return node
    }
    public inOrderTraverse(_node?:Node){
        if(_node === null){
            return
        }
        var node = _node || this.root;
        this.inOrderTraverse(node.left);
        console.log(node.key)
        this.inOrderTraverse(node.right);
    }
    public preOrderTraverse(_node?:Node){
        if(_node === null){
            return
        }
        var node = _node || this.root;
        console.log(node.key)
        this.preOrderTraverse(node.left);
        this.preOrderTraverse(node.right);
    }
    public postOrderTraverse(_node?:Node){
        if(_node === null){
            return
        }
        var node = _node || this.root;
        this.postOrderTraverse(node.left);
        this.postOrderTraverse(node.right);
        console.log(node.key)
    }
}

var tree = new Tree();
tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
tree.insert(8);
tree.insert(10);
tree.insert(13);
tree.insert(12);
tree.insert(14);
tree.insert(20);
tree.insert(18);
tree.insert(25);
tree.insert(6);
console.log(tree)
console.log(tree.search(6))
console.log(tree.min())
console.log(tree.max())
console.log(tree.inOrderTraverse())
console.log(tree.preOrderTraverse())
console.log(tree.postOrderTraverse())
console.log(tree.remove(15))

知识整理

web workers

相当于子进程进行计算,处理复杂计算,加载另一个 js 来加载代码。比较简单,看一个实际的例子。

// main.js
var worker = new Worker('js/worker.js');
var workerCallback = {};
var timer = +new Date();
workerCallback['ready'] = () => {
    worker.postMessage({
        type: 'start'
    });
    setTimeout(() => {
        worker.terminate();
    }, 300)
}
workerCallback['end'] = (e) => {
    console.log(+new Date() - timer);
}
worker.onmessage = (e) => {
    workerCallback[e.data.type](e);
}
worker.onerror = (e) => {
    console.log(`ERROR:${e.filename}+(e.lineno):e.message`)
}
// 也可以通过事件监听
worker.addEventListener('message', () => {
    workerCallback[e.data.type](e);
})

-----------------
// worker.js
var worker = this;
worker.postMessage({
    type: 'ready'
})
var workerInfo = {};
workerInfo['start'] = function() {
    var a = 1;
    for (var i = 0; i < 1000000000; i++) {
        a += i;
    }
    worker.postMessage({
        type: 'end',
        data: {
            result: a
        }
    });
}
worker.onmessage = function(e) {
    workerInfo[e.data.type](e);
}

数据传递 早期数据传递只能传字符串,会带来 from-string 和 to-string 的损耗,并且内存会是两份,后来有了结构化克隆算法,省去了字符串转化的性能,但是内存依旧会有两份。

message 传输的过程中可以传输对象,web worker 中的运行环境相当于一个没有 UI 的内核环境,所以很多方法也可以使用,比如setTimeout 等。

也可以通过子进程加载其他的脚本文件,如:import.scripts(‘路径名’)