如何在 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)

提前感谢您的帮助:)

我发现您的源代码中存在一些错误。

  1. 您正在导入 NewWorker,然后实例化 Worker
  2. 您正在使用 .ts 扩展名导入。
  3. 您在分配 onmessage 之前调用 postMessage
  4. 您将在收到一条消息后终止您的工作人员。与仅在现有 JavaScript 上下文中执行函数相比,启动 worker 需要更长的时间。
  5. 你的 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();