在函数内获取worker.onmessage的返回值?

Posted

技术标签:

【中文标题】在函数内获取worker.onmessage的返回值?【英文标题】:Get return value of worker.onmessage inside a function? 【发布时间】:2020-12-16 20:36:40 【问题描述】:

我创建了一个缓存(记忆)函数,它以另一个函数作为参数

以下是正在缓存的函数。该功能使用一个工人。这里的问题是,如果 var hello = GetSubRegion(1233) ,那么 hello 是未定义的,因为 onmessage 中的函数返回一个值,而不是父 GetSubRegion 函数。

function GetSubRegion(selectedMainRegion)
if (typeof(subRegWorker) != "undefined") 
subRegWorker.terminate();

subRegWorker = new Worker("subRegWorker.js");
subRegWorker.onmessage = function(e) 
var workData = e.data;
jQuery("#_sub_region").html(workData);
subRegWorker.terminate();
return workData;

var result = subRegWorker.postMessage(selectedMainRegion);
return result;

以下是缓存功能。由于上述问题, let result = fun(n) 没有返回值,因此没有缓存任何内容。

function memoizer(fun)
    let cache = 
    return function (n)
        if (cache[n] != undefined ) 
          return cache[n]
         else 
        console.log(n);
          let result = fun(n)
          cache[n] = result
          return result
        
    

如何解决?

以下是我调用缓存函数的方式。

jQuery("#_main_region").change(function() 
var getCacheSub = memoizer(GetSubRegion);
var inputMainRegion = jQuery('#_main_region').find(":selected").val();
getCacheSub(inputMainRegion);
);

【问题讨论】:

【参考方案1】:

缓存问题解决如下,修改后的代码是市场评论-

    var cache = ;
    function memoizer(fun)
        
        return function (n)
            if (cache[n] != undefined ) 
            jQuery("#_sub_region").html(cache[n]);  // This was changed
            return cache[n]
             else 
            console.log(n);
              cache[n] = result
              return result
            
        
    

function GetSubRegion(selectedMainRegion)
if (typeof(subRegWorker) != "undefined") 
subRegWorker.terminate();

subRegWorker = new Worker("subRegWorker.js");
subRegWorker.onmessage = function(e) 
var workData = e.data;
cache[n] = workData // This was changed
jQuery("#_sub_region").html(workData);
subRegWorker.terminate();
return workData;

subRegWorker.postMessage(selectedMainRegion);

【讨论】:

以上是关于在函数内获取worker.onmessage的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

web worker

js中的worker使用及多线程改单线程实现

如何在指定的时间内执行任意函数并获取其返回值?

JS多线程(web work)

从函数中获取返回值的麻烦

Javascript对象在函数内返回未定义