如何在 nativescript 中正确管理 worker?
How to correctly manage workers in nativescript?
我目前正在从事一个涉及 nativescript-vue 和 typescript 的项目,我必须与 workers 一起工作(我不太熟悉NS 和工人)。我已经阅读了文档并尝试了 NS 文档中给出的实现并将其调整到项目中,但我似乎无法正确使用它......确实它一开始有效但是在调用了几次实例化和管理工作人员,应用程序 无错误地崩溃了 ... 我不知道这是因为工作人员在完成任务后并没有真正关闭,还是有脚本本身的问题...
这是main.ts
代码的一部分
import "tns-core-modules/globals"
export class Main extends Vue {
worker: Worker
onTaskReceived(task){
this.manageWorker(task, this.worker)
}
manageWorker(task: any, worker: Worker){
const NewWorker = require('nativescript-worker-loader!./worker.ts')
worker = new Worker()
worker.postMessage({
type: "task",
value: task
})
worker.onerror = await function (err) {
console.log(`An unhandled error occurred in worker: ${err.filename}, line: ${err.lineno} :`);
console.log(err.message);
worker.terminate()
}
worker.onmessage = function (message) {
console.log('{onmessage}')
worker.terminate()
}
}
}
这是其中一名工人的代码 (worker.ts)
import "tns-core-modules/globals"
import { error } from "tns-core-modules/trace";
const context: Worker = self as any;
context.onmessage = function(task) {
const request = task.data
console.log('[WORKER]: data from main received')
console.log(request)
# Here is the code that the worker execute when triggered
if (result.state === 'done') {
console.log('[WORKER]: work done - sending data back')
context.postMessage({
type: 'result',
succeed: true,
value: result
})
}
}
context.onerror = function (error) {
console.log('[WORKER]{ERROR} '+error)
}
export default {} as typeof Worker & (new () => Worker)
提前感谢您的帮助:)
我发现您的源代码中存在一些错误。
- 您正在导入
NewWorker
,然后实例化 Worker
。
- 您正在使用
.ts
扩展名导入。
- 您在分配
onmessage
之前调用 postMessage
。
- 您将在收到一条消息后终止您的工作人员。与仅在现有 JavaScript 上下文中执行函数相比,启动 worker 需要更长的时间。
- 你的 worker 导出与我的不同(也许这不是问题?)。
在worker.ts
中:
import 'globals';
const context: Worker = self as any;
context.onmessage = (msg: MessageEvent): any => {
(global as any).postMessage({output: `rx: ${msg.message}`});
};
在其他地方:
import * as MyWorker from 'nativescript-worker-loader!./worker';
const worker: MyWorker = new MyWorker();
worker.onmessage((m: MessageEvent) => { console.log(`(out) ${m.output}`) });
worker.postMessage({ message: 'Hello, world!' });
// later: worker.terminate();
我目前正在从事一个涉及 nativescript-vue 和 typescript 的项目,我必须与 workers 一起工作(我不太熟悉NS 和工人)。我已经阅读了文档并尝试了 NS 文档中给出的实现并将其调整到项目中,但我似乎无法正确使用它......确实它一开始有效但是在调用了几次实例化和管理工作人员,应用程序 无错误地崩溃了 ... 我不知道这是因为工作人员在完成任务后并没有真正关闭,还是有脚本本身的问题...
这是main.ts
代码的一部分import "tns-core-modules/globals"
export class Main extends Vue {
worker: Worker
onTaskReceived(task){
this.manageWorker(task, this.worker)
}
manageWorker(task: any, worker: Worker){
const NewWorker = require('nativescript-worker-loader!./worker.ts')
worker = new Worker()
worker.postMessage({
type: "task",
value: task
})
worker.onerror = await function (err) {
console.log(`An unhandled error occurred in worker: ${err.filename}, line: ${err.lineno} :`);
console.log(err.message);
worker.terminate()
}
worker.onmessage = function (message) {
console.log('{onmessage}')
worker.terminate()
}
}
}
这是其中一名工人的代码 (worker.ts)
import "tns-core-modules/globals"
import { error } from "tns-core-modules/trace";
const context: Worker = self as any;
context.onmessage = function(task) {
const request = task.data
console.log('[WORKER]: data from main received')
console.log(request)
# Here is the code that the worker execute when triggered
if (result.state === 'done') {
console.log('[WORKER]: work done - sending data back')
context.postMessage({
type: 'result',
succeed: true,
value: result
})
}
}
context.onerror = function (error) {
console.log('[WORKER]{ERROR} '+error)
}
export default {} as typeof Worker & (new () => Worker)
提前感谢您的帮助:)
我发现您的源代码中存在一些错误。
- 您正在导入
NewWorker
,然后实例化Worker
。 - 您正在使用
.ts
扩展名导入。 - 您在分配
onmessage
之前调用postMessage
。 - 您将在收到一条消息后终止您的工作人员。与仅在现有 JavaScript 上下文中执行函数相比,启动 worker 需要更长的时间。
- 你的 worker 导出与我的不同(也许这不是问题?)。
在worker.ts
中:
import 'globals';
const context: Worker = self as any;
context.onmessage = (msg: MessageEvent): any => {
(global as any).postMessage({output: `rx: ${msg.message}`});
};
在其他地方:
import * as MyWorker from 'nativescript-worker-loader!./worker';
const worker: MyWorker = new MyWorker();
worker.onmessage((m: MessageEvent) => { console.log(`(out) ${m.output}`) });
worker.postMessage({ message: 'Hello, world!' });
// later: worker.terminate();