【问题标题】:How to correctly manage workers in nativescript?如何正确管理 nativescript 中的工作人员?
【发布时间】:2020-05-29 10:03:06
【问题描述】:

我目前正在从事一个涉及 nativescript-vue 和 typescript 的项目,我必须与 workers 合作(我对 NS 和 worker 不太熟悉)。我已经阅读了文档并尝试了 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)

提前感谢您的帮助:)

【问题讨论】:

  • 您可能需要遵循 Ian 的说明,除了尝试使用 Android Studio 中的日志监视器,它可能会为您提供有关崩溃的更多详细信息,共享日志和正确的代码以重现问题。

标签: typescript nativescript web-worker nativescript-vue


【解决方案1】:

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

  1. 您正在导入 NewWorker,但随后实例化了 Worker
  2. 您正在使用 .ts 扩展名导入。
  3. 您在分配onmessage 之前调用postMessage
  4. 在收到一条消息后,您将终止您的工作人员。与仅在现有 JavaScript 上下文中执行函数相比,启动 worker 需要更长的时间。
  5. 您的工人出口与我的不同(也许这不是问题?)。

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();

【讨论】:

  • 另外,一旦你完成了工作,你应该从内部关闭或终止工作人员。
  • 3 根本不是问题。 onmessage 监听工作线程 postMessage,它会在很久之后触发。 Aldo,即使是同一个MessageChannel,消息事件总是异步触发,所以你可以在postMessage之后同步添加onmessage,它会起作用。
  • 非常感谢您的回复@Ian、dashman 和 Kaiido :) 已通过您的反馈解决了问题!
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 2018-09-28
  • 1970-01-01
  • 2012-10-26
  • 2016-05-23
  • 2019-07-13
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多