Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何正确管理nativescript中的工作人员?_Typescript_Nativescript_Web Worker_Nativescript Vue - Fatal编程技术网

Typescript 如何正确管理nativescript中的工作人员?

Typescript 如何正确管理nativescript中的工作人员?,typescript,nativescript,web-worker,nativescript-vue,Typescript,Nativescript,Web Worker,Nativescript Vue,我目前正在从事一个项目,涉及nativescript vue和typescript,我必须与工作者一起工作(我对NS和工作者不太熟悉)。我已经阅读了文档,尝试了NS文档中给出的实现,并将其调整到项目中,但我似乎无法正确地实现它。。。确实,它一开始可以工作,但在调用了几次实例化和管理worker的方法之后,应用程序崩溃,没有出现错误。。。我不知道这是因为工作人员在完成任务后没有真正关闭,还是脚本本身有问题 这是main.ts代码的一部分 import "tns-core-modules/globa

我目前正在从事一个项目,涉及nativescript vue和typescript,我必须与工作者一起工作(我对NS和工作者不太熟悉)。我已经阅读了文档,尝试了NS文档中给出的实现,并将其调整到项目中,但我似乎无法正确地实现它。。。确实,它一开始可以工作,但在调用了几次实例化和管理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)的代码


提前感谢您的帮助:)

我发现您的源代码中有一些错误

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

    导入“globals”;
    const context:Worker=self,如有;
    context.onmessage=(msg:MessageEvent):any=>{
    postMessage({output:`rx:${msg.message}}}});
    };
    
    在其他任何地方:

    从“nativescript worker loader!”以MyWorker的身份导入*/工人;;
    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和Kaido:)通过您的反馈纠正了这个问题!您可能希望按照Ian的说明进行操作,除了尝试使用Android Studio的日志监视器(它可能会为您提供有关崩溃的更多详细信息)之外,还可以共享日志和正确的代码来重现问题。
    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)