2016-05-23 67 views
0

我有factory,我想用Web Worker为angularJs(lib from here网络中使用工作者的角度服务

var appServices= angular.module('appServices', ['ngResource', 'ngWebworker']); 

appServices.factory('CurrentUserData', [ 
    'apiPath', '$resource', '$rootScope', 'Auth','Webworker', 
    function (apiPath, $resource, $rootScope, Auth, Webworker) { 
     var requests = $resource(apiPath + "/Requests", {}); 
     var pendingRequests = $resource(apiPath + "/RequestRecipient/Pending", {}); 

     var requestResources = []; 
     var pendingRequestResources = []; 

     var updateResources = function(resource, newResource) { 
      if (angular.isArray(resource)) { 
       resource.length = 0; 
       for (var i = 0; i < newResource.length; ++i) { 
        resource.push(newResource[i]); 
       } 
      } else { 
       for (var key in resource) { 
        delete resource[key]; 
       } 
       for (var key in newResource) { 
        resource[key] = newResource[key]; 
       } 
      } 
     }; 

     var fetchResources = function(){ 
      user = Auth.getCurrentUser(); 
      if(!user){ 
       return; 
      } 
      requests.query(function (requestResponse) { 
       updateResources(requestResources, requestResponse); 
      }); 
      pendingRequests.query(function (requestResponse) { 
       updateResources(pendingRequestResources, requestResponse); 
      }); 
     }; 


     fetchResources(); 
     setInterval(fetchResources, 120000); // Here I want to use Worker, which can Update requestResources and pendingRequestResources in "new thread" 

     return { 
      'requests': function() { 
       return requestResources; 
      }, 
      'pendingRequests': function() { 
       return pendingRequestResources; 
     } 
} 

我试图用网络工作者在接下来的方式:

fetchResources();//init arrays 

    if (window.Worker) { // Check if Browser supports the Worker api. 
     var myWorker = Webworker.create(setInterval); 
     myWorker.run(fetchResources, 120000).then(function(result) { 
      console.log("done"); 
     }); 
    } else { 

     setInterval(fetchResources, 120000); 
    } 

上启动我的阵列然后在网络工作者更新他们每120000毫秒,但我得到错误:

angular.js:11655 Error: Failed to execute 'postMessage' on 'Worker': An object could not be cloned.

所以我认为这是我的custon服务的问题,我使用的是函数,它传递给了网络工作者。

+0

问题是您传递的是函数而不是数据。作为Web工作者的'setInterval'没有任何意义,它应该在worker中调用。 – zeroflagL

+0

调用'postMessage'在哪里?在你发布的所有代码中,我没有看到任何'postMessage'方法... – Wilt

+0

@Wilt,请检查我使用的库的“文档”http://mattslocum.github.io/ng-webworker/我想我做了文档中描述的所有内容。 – demo

回答

0

你在postMessage中传递的参数是无效的 - 最可能传递一个函数?工作人员完全处于单独的执行范围内,不能将其传递给DOM,局部变量,范围等的任何引用。