1

我正在研究 HTML5 网络工作者,我创建了一个生成少量工作者并返回结果的函数,但问题是它在工作者更新结果之前返回值。所以我想延迟返回语句,直到收到所有结果

for (i = 0; i < array1_rows; i++)
{
    var worker = new Worker('json.js');
    worker.postMessage(arr1[i]);
    worker.postMessage(arr2);
    worker.postMessage(i);

    worker.onmessage = storeResult;
}

/////////////////////////////////

return result;

所以我只想延迟返回语句,直到收到结果。请帮助我了解如何在 java 脚本中使用 yield。

4

1 回答 1

6

就像评论指出的那样——Web Workers 异步工作(想想 AJAX 是如何工作的)

您可以使用异步信号量仅在它们全部完成后才产生

function doSomething(callback){
    var counter = array1_rows;
    for (i = 0; i < array1_rows; i++)
    {
        var worker = new Worker('json.js');
        worker.postMessage(arr1[i]);
        worker.postMessage(arr2);
        worker.postMessage(i);

        worker.onmessage = function(){
            storeResult.apply(arguments);//call it the same way it was called before.
            counter--;
            if(counter === 0){ // all workers returned
                callback(result); //or whatever you're updating in storeResult
            }
        };
    }
}

现在你可以这样称呼它:

doSomething(function(result){
    console.log(result); //this will print the correct result.
});

有关 JS 异步操作如何工作的更多信息,我推荐这个与 ajax 相关的问题,其中包括对问题的描述以及如何解决它。,

于 2013-08-23T11:14:41.567 回答