有点晚的答案,但也许它可以帮助其他人。
看看https://www.javascripttuts.com/how-to-use-web-workers-with-ionic-in-one-go/
我按照那篇文章做了一些调整,因为我必须按需调用工作方法,而不是在构造函数上。
在./src/assets 文件夹上创建一个名为workers 的新文件夹,您的worker.JS 文件将存放在其中。是的 JS 不是 TS,据我所知 TypeScript 文件不会编译为可用的网络工作者。
创建一个网络工作者。我将粘贴我的模糊搜索网络工作者 (./assets/workers/fuzzysearch-worker.js) 的主要代码:
'use strict';
var pattern, originalList;
self.onmessage = function(event) {
// Receive a message and answer accordingly
pattern = event.data.pattern;
originalList = event.data.originalList;
self.doFuzzySearch();
};
self.doFuzzySearch = function() {
var filteredList;
console.time('internalFastFilter');
filteredList = self.fastFilter(originalList, (item) => self.hasApproxPattern(item.searchField, pattern));
console.timeEnd('internalFastFilter');
// Send the results back
postMessage({ filteredList: filteredList });
};
// The code above is purposely incomplete
在您的 .ts 文件中声明工作变量(通常在构造函数上方):
private readonly searchWorker: Worker = new Worker('./assets/workers/fuzzysearch-worker.js');
关于构造函数:
constructor(/* Other injected dependencies here */
public ngZone: NgZone) {
this.searchWorker.onmessage = (event) => {
// Inside ngZone for proper ChangeDetection
this.ngZone.run(()=> {
this.dataList = event.data.filteredList;
console.timeEnd('searchWorker');
})
};
}
最后,关于你的“action function”,让我们说doSearch:
doSearch(event) {
// ... extra code to do some magic
console.time('searchWorker');
this.searchWorker.postMessage({ command: 'doFuzzySearch', originalList: this.realList, pattern: searchFilter });
// ... extra code to do some other magic
}
this.searchWorker.postMessage 拨打电话。所有繁重的加载操作都在 webworker 内部解决。
希望对您有所帮助。
最好的问候。