Цитата:
DOMException [DataCloneError: "The object could not be cloned." code: 25 nsresult: 0x80530019 location: http://www.xxx.com/anguler-tasks-con...kers.min.js:1] а если сделать так, то функция отрабатывает : var param = { content: $fileContent, funcParseCSV: "function parseCSV(content) { console.log('ok'); } parseCSV();" }; angularWorker.run(obj); а в воркере: eval(input.funcParseCSV); Но мне так не хотелось бы делать, т.к. лучше вариант - определить эту функцию внутри worker-a |
okuznetsov1,
А, ну да, input -- сериализуемым оъектом должен быть, для ф-ции не подходит. Тогда твой 1 вариант, ок. А зачем вообще эту ф-цию в scope объявлять и пытаться передавать? Может лучше сделать чистую функцию, объявить её в теле самого воркера и применять? А Content как раз передавать первым параметром run(). |
Цитата:
вроде получилось как хотел, сделал так: передаю в воркер: var bodyFuncParseCSV = eval($scope.parseCSV).toString(); var param = { content: $fileContent, funcParseCSV: bodyFuncParseCSV }; return angularWorker.run(param); в теле воркера вызываю так: var Items = eval('var parseCSV = ' + input.funcParseCSV + '; parseCSV(input.content);'); Не знаю костыль это или нет, как вы считаете? |
okuznetsov1,
обычно eval не рекомендуют к использованию. Цитата:
|
Цитата:
|
okuznetsov1,
$scope.content = 'blabla'; var workerPromise1 = WorkerService.createAngularWorker(['input', 'output', function(input, output) { function parseCSV(input){ /* body parseCSV */ return parseInput } output.notify(parseCSV(input)); }]); var workerPromise2 = WorkerService.createAngularWorker(['input', 'output', '$http', function(input, output, $http) { angular.forEach(input, function (value, key) { $http.post('http://www.xxx.com/anguler-tasks-contacts/addContactData.php',{last_name:value[1], name:value[2], patronymic_name:value[3], address:value[4], telephone:value[5], url:value[6], description:value[7], completed:'false'}) .then(function(response){ output.notify(response.data[0]); }); }); }]); workerPromise1.then(function success(angularWorker) { //The input must be serializable return angularWorker.run($scope.content); }, function error(reason) { //for some reason the worker failed to initialize //not all browsers support the HTML5 tech that is required, see below. }).then(function success(result) { //handle result }, function error(reason) { //handle error }, function notify(Items) { workerPromise2.then(function(angularWorker){ return angularWorker.run(Items) }).then( function(){}, function(){}, function notify(response){console.log(response)} ) }); |
Цитата:
Спасибо, очень мне помогли. Но сейчас из всего вышесказанного у меня возник ещё один вопрос (наверное последний): У меня возникла необходимость (как ранее я и предполагал) задействовать 2-ой воркер (workerPromise2) для расширения функционала системы. В свзи с этим возник вопрос - "как можно запустить второй воркер из другого контроллера", возможно ли такое? Сейчас я продублировал код 2-го воркера в другом контроллере. Но такое решение разумеется мне не нравится. По сути в другом контроллере я разместил такой же код (что вы прислали в последнем сообщении), выглядит так: app.controller('MainController', ['$scope', 'WorkerService', 'LxNotificationService', '$http', '$log', function($scope, WorkerService, LxNotificationService, $http, $log) { $scope.content = 'blabla'; $scope.addContact = function() { var workerPromise2 = WorkerService.createAngularWorker(['input', 'output', '$http', function(input, output, $http) { angular.forEach(input, function (value, key) { $http.post('http://www.xxx.com/anguler-tasks-contacts/addContactData.php',{last_name:value[1], name:value[2], patronymic_name:value[3], address:value[4], telephone:value[5], url:value[6], description:value[7], completed:'false'}) .then(function(response){ output.notify(response.data[0]); }); }); }]); workerPromise2.then(function(angularWorker){ return angularWorker.run(Items) }).then( function(){}, function(){}, function notify(response){console.log(response)} ) }; }]); |
okuznetsov1,
А может лучше тогда в сервисе этот код воркера обьявить, инжектить сервис в каждый контроллер и оттуда вызывать? |
спасибо
|
Часовой пояс GMT +3, время: 12:14. |