Как правильно управлять воркерами в nativescript? - PullRequest
0 голосов
/ 29 мая 2020

В настоящее время я работаю над проектом, включающим nativescript- vue и машинописный текст , и я должен работать с worker (я не очень хорошо знаком с NS и worker). Я прочитал do c и попробовал реализацию, указанную в документации 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 Ответ

1 голос
/ 29 мая 2020

Я вижу несколько ошибок в вашем источнике.

  1. Вы импортируете NewWorker, но затем создаете экземпляр Worker.
  2. Вы импортируете с .ts добавочный номер.
  3. Вы звоните на postMessage перед тем, как назначить onmessage.
  4. Вы завершаете работу своего работника после получения одного сообщения. Загрузка воркера займет больше времени, чем просто выполнение функции в вашем существующем JavaScript контексте.
  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();
...