【问题标题】:how to use web worker in angular js for calling service?如何在 Angular js 中使用 Web Worker 来调用服务?
【发布时间】:2015-07-22 11:16:56
【问题描述】:

我做了一个简单的程序来调用http服务。首先我在我的控制器中调用http服务并在给定plunker的视图上显示数据

http://plnkr.co/edit/sHLQJaH7ElHVU6xweQuS?p=preview

但我需要使用网络工作者调用服务并将数据发送到我的控制器。我们可以在后台调用服务吗? 我有一个解决方案,但不适合我

AngularJS and web workers

我在我的 plunker 中使用了这个解决方案 http://plnkr.co/edit/7OZvbFnHxuVLUtDFf1hm?p=catalogue

无法在我的项目中实现 web worker 能否请您告诉我如何在 angular js 中使用 webworker

.factory("HelloWorldService",['$q',function($q){

    var worker = new Worker('https://dl.dropboxusercontent.com/s/9wkl32e23vdvs6h/default.json?dl=0');
    var defer = $q.defer();
    worker.addEventListener('message', function(e) {
      console.log('Worker said: ', e.data);
      defer.resolve(e.data);
    }, false);

    return {
        doWork : function(successcallback,errorcallback){
            defer = $q.defer();
           // worker.postMessage(myData); // Send data to our worker. 
            return defer.promise;
        }
    };

}]);

【问题讨论】:

  • 您确定正在加载您的工作文件吗?你奇怪地从 Dropbox 加载了一个 worker.js 文件
  • @NicholasKyriakides 在第一次尝试使用之前我从不使用网络工作
  • 你能告诉我如何使用webworks吗?
  • @NicholasKyriakides 来自此链接,用户如何在后台调用 http 服务器请求。您能否在我的 plunker 上更改一些 ..或在 webwork 的 plunker 上制作简单的程序

标签: javascript angularjs web-worker


【解决方案1】:

我修复了你的代码并为你构建了小样本。

  1. pnkr 对于您的样本数据有点慢,所以您必须 耐心看结果(肯定要等 30 秒)
  2. http://plnkr.co/edit/JXoylu9RbkY4hepTgirJ?p=preview

由于 worker 是纯 JS,并且出于示例原因,我想将所有内容保存在一个文件中,并且希望源代码也能在 IE 中兼容,我使用了 URL.createObjectURL,但你可以将在单独的文件中下载 scipt。

在这种情况下使用worker是没有用的,因为你没有在那里做任何工作,只是下载东西,最好使用$http.get

工人的重要部分:

 doWork : function(){
       var worker = new Worker(blobURL);
        var defer = $q.defer();

        worker.addEventListener('message', function(e) {
        console.log('Worker said: ', e.data);
           defer.resolve(e.data);
          }, false);

        worker.postMessage("random data to worker"); // Send data to our worker. 
        return defer.promise;
    }

然后自己工作:

var blobURL = URL.createObjectURL(new Blob([
    "onmessage = function (event) { \
        var xhr = new XMLHttpRequest(); \
        xhr.onreadystatechange=function(){\
        if (xhr.readyState==4 && xhr.status==200){\
            postMessage(xhr.responseText);\
        }\
    }; \
    xhr.open('GET', 'https://dl.dropboxusercontent.com/s/9wkl32e23vdvs6h/default.json?dl=0' , false); \
    xhr.send(); \
    }"
    ], { type: 'application/javascript' }));

从你的控制器调用

   HelloWorldService.doWork().then(function(data){
     console.log("data received to Ctrl");
   $scope.results = data;})

为了显示结果,我只是在 html 中推出原始响应,因为问题是关于网络工作者的。

【讨论】:

  • 我理解你的代码..但我知道我可以在角度中使用 $http 来实现这一点。但是我将在哪里使用woker?我们在哪里使用网络工作者..你能举个简单的例子,以便更好地理解使用文档我无法正确理解
  • 我只需要一个简单的例子,我们去工人。正如每个人都说我们在其中创建线程..所以你能不能举一个简单的例子,其中两个函数同时运行。在那个函数上有循环100
  • 我也更新了回复中的链接,但这里是正确的链接:plnkr.co/edit/JXoylu9RbkY4hepTgirJ?p=preview
  • 谢谢你能看到上面的评论
  • plnkr.co/edit/HvHKUskRqtLLAl2G8Nkv?p=preview 基本上工作人员只需等待几秒钟并发送响应。我用不同的参数调用了同一个工人两次,所以它更清晰可见。
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
相关资源
最近更新 更多