如何在nativescript中正确管理工人?

问题描述 投票:0回答:1

我目前正在做一个项目,涉及 nativescript-vue和typescript 而我必须与 工人 (我对NS和工人不太熟悉)。我阅读了文档,并尝试了NS文档中给出的实现方法,并将其调整到项目中,但我似乎无法使其正确......。的确,一开始是可以工作的,但是在调用了几次实例化和管理worker的方法后,app 崩溃而不出错... 我不知道是由于worker在完成任务后没有真正关闭,还是脚本本身有问题......

这是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(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)

提前感谢您的帮助:)

typescript nativescript web-worker nativescript-vue
1个回答
1
投票

我在你的源码中看到一些错误。

  1. 你导入的是 NewWorker,但随后实例化 Worker.
  2. 你在导入一个 .ts 分机。
  3. 你叫 postMessage 赋值前 onmessage.
  4. 您在收到一条消息后就终止了您的 Worker。引导 Worker 比在现有 JavaScript 上下文中执行该函数所需的时间更长。
  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();
© www.soinside.com 2019 - 2024. All rights reserved.