业务需求是在前端显示报表,但是sharepoint online无法直接用数据库,只能调REST API在前端显示
一、内嵌worker
此方法优点是浏览器不用每次去加载你所写的worker.js
this.domElement.innerHTML=`<p>Worker 花费时间: <output id="result"></output></p>
<button >开始 Worker</button>
<button >开始主线程</button>
<p>原花费时间: <output id="result1"></output></p>
<canvas id="mychart"></canvas>
//插入的worker
<script id='worker1' type="javascript/worker">
var a;
function groupBy(array, f) {
const groups = {};
array.forEach(function (o) {
const group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function (group) {
return groups[group];
});
}
addEventListener('message', (message) => {
var status;
var st = new Date();
var xLabel=[],ylabel=[];
groupBy(message.data,(t)=>{
return t.country
}).forEach(function(e){
xLabel.push(e[0].country);
var sum=0;
e.forEach(element => {
sum+=element.cost;
});
ylabel.push(sum);
})
status = (new Date().getTime() - st.getTime()) + ' ms';
postMessage("time :"+status) ;
});
</script>`;
下面通过新建worker来调用,
var blob = new Blob([document.querySelector('#worker1').textContent]);
const worker = new Worker(window.URL.createObjectURL(blob));
worker.addEventListener('message', message => {
document.getElementById('result').innerHTML=message.data;
});
this.domElement.getElementsByTagName('button').item(0).addEventListener('click',function(){
worker.postMessage(c);
})
二、调用外部worker.js文件
编写js文件
var a;
function groupBy(array, f) {
debugger;
const groups = {};
array.forEach(function (o) {
const group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function (group) {
return groups[group];
});
}
addEventListener('message', (message) => {
var status;
var st = new Date();
var xLabel=[],ylabel=[];
groupBy(message.data,(t)=>{
return t.country
}).forEach(function(e){
xLabel.push(e[0].country);
var sum=0;
e.forEach(element => {
sum+=element.cost;
});
ylabel.push(sum);
})
status = (new Date().getTime() - st.getTime()) + ' ms';
postMessage("time :"+status) ;
});
声明file-loaderfile-loader把js加载到服务器此文件为file-loader.d.ts文件,typescript会进行编译根据此js加载
declare module "file-loader?name=[name].js!*" {
const value: string;
export = value;
}
声明创建worker
import * as workerPath from "file-loader?name=[name].js!./test.worker";
const worker = new Worker(workerPath);
console.log(workerPath, worker);
worker.addEventListener('message', message => {
console.log(message);
});
worker.postMessage('this is a test message to the worker');