1

私は HTML5 Web ワーカーに取り組んでおり、いくつかのワーカーを生成して結果を返す関数を作成しましたが、ワーカーが結果を更新する前に値を返すという問題があります。したがって、すべての結果が受信されるまで return ステートメントを遅らせたい

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;

したがって、結果が受信されるまでその return ステートメントを遅らせたいだけです。javaスクリプトでyieldを使用する方法を教えてください。

4

1 に答える 1

6

コメントが指摘しているように - Web ワーカーは非同期で動作します (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 に答える